【发布时间】:2015-12-28 04:40:18
【问题描述】:
假设我有以下代码行:
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;
我们还假设系统以 little-endian 模式和a = 100 存储字节。
当使用这样的显式转换时,最左边的字节会消失吗?
我猜想在执行上述几行之后,变量将保存这些值:b=100, c=0, d=0, e=0。对吗?
【问题讨论】:
-
除非您使用
unsigned变量,否则这将导致undefined behaviour。然后最重要的部分将被截断。字节顺序在此示例中无关紧要。 -
@WeatherVane 是未定义行为还是意外行为?符号位的行为是确定性的。
-
@nicomp 只要行为是意料之外的,为什么不应该是未定义的?
-
右移负符号整数是实现定义,而不是未定义行为。标准说(§6.5.7):
E1 >> E2的结果是E1右移E2位位置。如果E1具有无符号类型或E1具有带符号类型和非负值,则结果的值是E1 / 2 ** E2商的整数部分。如果E1具有带符号类型和负值,则结果值是实现定义的。(我使用2 ** E2表示2 的E2 次方,因为2<sup>E2</sup>在cmets 中不起作用,甚至在代码引号之外(2E2 — 看!)。