带有签名和无符号的Bitshift操作

时间:2013-09-05 08:38:12

标签: c++ c visual-c++ visual-studio-2005

我正在做一个int的bithift操作,并且对它没有按预期出现感到惊讶。

int i, res;
i = 0x80000000;
res = i>>1;                //results in 0xc0000000
res = (unsigned int) i>>1; //results in 0x40000000

一个整数位的移位怎么可能只能工作到第31位?

1 个答案:

答案 0 :(得分:8)

您所看到的可能是arithmetic bit shift

  

当向右移动时,最左边的位(通常是符号位)   复制有符号整数表示形式以填充所有   空缺职位(这是一种标志延伸)。

C99 standard6.5.7§5说:

  

E1>的结果> E2是E1右移E2位位置。 [...]如果E1具有有符号类型和负值,则为结果值   是实现定义的。

因此结果可能是编译器编写者决定的结果。他们可能决定扩展符号位,编译器文档应该提到它。