显式转换如何在 C 中工作?

How does explicit casting work in 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。对吗?

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

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

  • 不需要显式转换为 (char),因为 C 会将表达式值隐式转换为赋值目标的类型。我想程序员以这种方式编写它是为了消除编译器警告。众所周知,Microsoft 编译器经常抱怨赋值精度下降。

  • 最左边字节不会消失,该值是根据char的大小计算的,希望您的情况是 8 位,因此 (char)aa & 255 基本相同。但是如果 char 是有符号的,如果值超过 CHAR_MAX,这种行为实际上并没有被标准很好地定义。对于这种位操作,使用 unsigned 类型是明智的。