3

我正在对 int 进行移位操作,但很惊讶它没有按预期出现。

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

整数中的一位移位怎么可能只对第 31 位起作用?

4

1 回答 1

8

您所看到的可能是算术位移

当向右移动时,最左边的位(通常是有符号整数表示中的符号位)被复制以填充所有空位(这是一种符号扩展)。

C99 标准6.5.7§5说:

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

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

于 2013-09-05T08:42:38.800 回答