右移C中的负数

右移C中的负数

我有C代码,我在其中执行以下操作。

int nPosVal = +0xFFFF;   // + Added for ease of understanding
int nNegVal = -0xFFFF;   // - Added for valid reason

现在,当我尝试

printf ("%d %d", nPosVal >> 1, nNegVal >> 1);

我明白了

32767 -32768

这是预期的吗?

我能够想到类似的东西

65535 >> 1 = (int) 32767.5 = 32767-65535 >> 1 = (int) -32767.5 = -32768

也就是说,-32767.5四舍五入为-32768。

这种理解是否正确?


尚方宝剑之说
浏览 533回答 3
3回答

至尊宝的传说

不,在使用整数时,不会得到像0.5这样的小数。当您查看两个数字的二进制表示时,可以很容易地解释结果:      65535: 00000000000000001111111111111111      -65535: 11111111111111110000000000000001位移到右边一位,并在左边延伸(请注意,这取决于实现,感谢Trent): 65535 >> 1: 00000000000000000111111111111111-65535 >> 1: 11111111111111111000000000000000转换回十进制: 65535 >> 1 = 32767  -65535 >> 1 = -32768

潇湘沐

C规范没有规定符号位是否被移位。它取决于实现。
打开App,查看更多内容
随时随地看视频慕课网APP