为了账号安全,请及时绑定邮箱和手机立即绑定

右移C中的负数

右移C中的负数

C
尚方宝剑之说 2019-08-09 10:25:21
右移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。这种理解是否正确?
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

不,在使用整数时,不会得到像0.5这样的小数。当您查看两个数字的二进制表示时,可以很容易地解释结果:

      65535: 00000000000000001111111111111111
     -65535: 11111111111111110000000000000001

位移到右边一位,并在左边延伸(请注意,这取决于实现,感谢Trent):

 65535 >> 1: 00000000000000000111111111111111-65535 >> 1: 11111111111111111000000000000000

转换回十进制:

 65535 >> 1 = 32767
 -65535 >> 1 = -32768


查看完整回答
反对 回复 2019-08-09
?
潇湘沐

TA贡献1816条经验 获得超6个赞

C规范没有规定符号位是否被移位。它取决于实现。


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 532 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信