原码、反码、补码问题以及-32768~+32767问题

原码、反码、补码问题以及-32768~+32767问题

1. 原码、反码、补码问题

 在C语言中,对于有符号整形数,原码的最高位为符号位,符号位为0表示正数,符号位为1表示负数,仅用原码来表示数是没有问题的,但进行加减时会出现问题。因此,为了解决正数与负数的加减问题,引出了反码;而反码有正负零问题,因此进一步引出了补码。
正、负数反码和补码的计算方法:
1.对于正数,其原码、反码、补码都相同
2.对于负数,
  反码:在原码的基础上,符号位不变,其余位取反。
  补码:在补码的基础上加一。
  由补码计算原码:求补码的补码即可,即对补码先取反码再取+1。

2.-32768~+32767问题

 由于-32768~+32767的数值范围较广,为方便展示,此处举-8 ~ +7 的例子作为展示,两者本质相同。
对于一个有符号的4位有整形数,按常规思路写出其中所有数的原码以及补码:
  +7: 0111 0111
  +6: 0110 0110
  +5: 0101 0101
  +4: 0100 0100
  +3: 0011 0011
  +2: 0010 0010
  +1: 0001 0001
  +0: 0000 0000
  -0: 1000 0000
  -1: 1001 1111
  -2: 1010 1110
  -3: 1011 1101
  -4: 1100 1100
  -5: 1101 1011
  -6: 1110 1010
  -7: 1111 1001
观察上表可知,补码0000对应的原码有两个:正0和负0,而按理来说,补码和原码应该是一 一对应的关系。同时,补码列中缺少了一个1000。为了解决上述问题,人为规定,将1000这个补码分配给-8。更改以后,补码列表变为:
  +7: 0111 0111
  +6: 0110 0110
  +5: 0101 0101
  +4: 0100 0100
  +3: 0011 0011
  +2: 0010 0010
  +1: 0001 0001
  +0: 0000 0000
  -1: 1001 1111
  -2: 1010 1110
  -3: 1011 1101
  -4: 1100 1100
  -5: 1101 1011
  -6: 1110 1010
  -7: 1111 1001
  -8: 1000 1000
满足补码和原码的一 一对应关系,同时,补码从上到下是连续变化的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值