我们说我有以下代码行:
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
。是不是?
答案 0 :(得分:2)
你猜对了!但你的解释并不完全正确:
上述代码的行为不依赖于系统的字节序:如果int
是32位而char
是8位,a >> 24
是高位字节和a & 255
低位字节,用于所有可能的字节序可能性。
不需要显式转换为(char)
,因为C将表达式值隐式转换为赋值目标的类型。我想程序员用这种方式写它来使编译器警告静音。众所周知,微软编译器在失去作业精度方面声名远扬。
最左边的字节不会消失,该值的计算模数为char
,希望在您的情况下为8位,所以{ {1}}与(char)a
基本相同。但是,如果a & 255
已签名,则如果值超过char
,则标准实际上未明确定义此行为。使用CHAR_MAX
类型进行这种位操作是明智的。