【发布时间】:2016-03-30 14:30:10
【问题描述】:
C99 规范指出:
E1 >> E2 的结果是 E1 右移 E2 位位置。如果 E1 具有无符号类型或 E1 具有带符号类型和非负值,则结果的值是 E1 / 2^E2 商的整数部分。如果 E1 具有带符号类型和负值,则结果值是实现定义的。
我很想知道,哪些实现/编译器不会将签名的E1 >> 31 视为一堆11111....?
【问题讨论】:
-
少数 -1 不是 1111....,还有很多 int 不是 32 位的。
-
注意:不要使用过时的标准版本。 C 标准是 C11,而不是 C99。说起来,文字很清楚。如果您希望代码可移植,请不要依赖它。请注意,班次也可以调用未定义的行为。参见标准中的 6.5.7p3(即唯一有效的版本)。
-
还有许多 32 位二进制补码实现,它们忽略签名并产生
1作为结果。该标准实际上措辞谨慎,以避免指定>>是执行算术移位还是逻辑移位。