显式转换如何在 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)a
与 a & 255
基本相同。但是如果 char
是有符号的,如果值超过 CHAR_MAX
,这种行为实际上并没有被标准很好地定义。对于这种位操作,使用 unsigned
类型是明智的。
假设我有以下代码行:
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)a
与a & 255
基本相同。但是如果char
是有符号的,如果值超过CHAR_MAX
,这种行为实际上并没有被标准很好地定义。对于这种位操作,使用unsigned
类型是明智的。