关于C中的逐位移位算子

时间:2014-01-14 20:24:15

标签: c bit bit-shift

根据文字: “在极少数情况下,C / C ++编译器在负数右移时不执行符号扩展,向右移位以分割数字的技巧失败”

考虑以下示例:

unsigned int i = 0b10000000; // 128
i = i >> 1; // i equals 01000000 i.e. 64 

这是我知道阻止签名扩展的唯一方法。此外,通过添加unsigned它变为正数,所以请更正。

1 个答案:

答案 0 :(得分:2)

负数的按位右移的符号扩展是在C中实现定义的。这意味着由编译器决定它是否执行符号传播,编译器文档必须记录所选行为。

来自C标准:

  

(C99,6.5.7)“如果E1具有有符号类型和负值,则结果值是实现定义的。”

在编译器中,gcc始终传播符号:

  

签名`>>'通过符号扩展对负数进行处理。

http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html

相关问题