显式铸造如何在C中工作?

时间:2015-12-27 20:27:16

标签: c casting explicit

我们说我有以下代码行:

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 个答案:

答案 0 :(得分:2)

你猜对了!但你的解释并不完全正确:

  • 上述代码的行为不依赖于系统的字节序:如果int是32位而char是8位,a >> 24是高位字节和a & 255低位字节,用于所有可能的字节序可能性。

  • 不需要显式转换为(char),因为C将表达式值隐式转换为赋值目标的类型。我想程序员用这种方式写它来使编译器警告静音。众所周知,微软编译器在失去作业精度方面声名远扬。

  • 最左边的字节不会消失,该值的计算模数为char,希望在您的情况下为8位,所以{ {1}}与(char)a基本相同。但是,如果a & 255已签名,则如果值超过char,则标准实际上未明确定义此行为。使用CHAR_MAX类型进行这种位操作是明智的。