2015-12-27 5 views
0

Скажем, у меня есть следующие строки кода:Как работает явное литье в C?

int a; // 4-byte-integer 
char b, c, d, e; 

b = (char)(a >> 24); 
c = (char)(a >> 16); 
d = (char)(a >> 8); 
e = (char)a; 

Давайте также предположим, что система хранения байтов в режиме прямой порядок байтов и a = 100.

При использовании явного приведения в порядок, исчезают ли самые левые байты? Я предполагаю, что после выполнения вышеуказанных строк переменные будут содержать эти значения: b=100, c=0, d=0, e=0. Это правильно?

+1

Если вы не используете переменные 'unsigned', это вызовет' undefined behaviour'. Тогда наиболее значительная часть будет усечена. В этом примере утверждение не имеет значения. –

+3

Dup of http://stackoverflow.com/questions/6752567/casting-a-large-number-type-to-a-smaller-type? – Turn

+0

@WeatherVane - это неопределенное поведение или непредвиденное поведение? Поведение знакового бита детерминировано. – nicomp

ответ

2

Вы догадываетесь правильно! Но ваше объяснение не совсем корректно:

  • Поведение выше кода не зависит от байтов системы: если int 32 бита и бит, a >> 24 является байт высокого порядка и a & 255 младший байт, для всех возможных возможностей.

  • Явные приведения как (char) не нужны, поскольку C неявно преобразует значение выражения в тип назначения назначения. Я предполагаю, что программист написал это так, чтобы отключить предупреждение компилятора. Компиляторы Microsoft, как известно, вокально о потере точности в назначениях.

  • в крайние левые байт не исчезают , значение вычисляется по модулю размера char, будем надеяться 8 битов в вашем случае, поэтому (char)a является по существу такой же, как a & 255. Но если подписан char, это поведение на самом деле не определено Стандартом, если значение превышает CHAR_MAX. Целесообразно использовать типы unsigned для такого рода манипулирования бит.