有符号和无符号的位移操作

2024-04-10

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

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

整数中的一位移位怎么可能只能到第 31 位?


你所看到的可能是算术位移位 http://en.wikipedia.org/wiki/Arithmetic_shift.

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

The C99标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf6.5.7§5 说:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有符号和无符号的位移操作 的相关文章

随机推荐