为什么要使用补码


首先,介绍一个简单的概念: 1GB = 1024MB = 1024*1024KB = 1024*1024*1024B(Byte) = 1024*1024*1024*8 bits。

在计算机编译器中,当我们定义一个字符型变量a,即 char a ,这时,计算机会分配8个bit给a变量,即是一个字节,所能存储的数字是[0,255],正好对应256个ASCII码,因此也可以得出,一个ASCII占用一个字节。

当我们定义一个整型变量b,即 int b ,这时,计算机会分配36个bit给b变量,即4个字节,它所存储的数字范围是[-2^31,2^31-1],可能你对这个两个数字有些疑惑,为什么是它们?我们知道,计算机数据类型中包括有符号数和无符号数,int b 则默认是有符号数,计算机采用补码的方式来存储有符号数,将二进制的第一位作为符号位(0表示正数,1表示负数),其余位作为数字位,规则是:当检测第一位为0时,即是正数,其补码还是它本身,当检测第一位为1时,即是负数,其补码为除第一位符号位从左往右依次取反,然后再加1,举个例子,-8的二进制表示为1000 1000,对它除第一位取反,得到1111 0111,然后加1,得到1111 1000,因此我们得到了-8的二进制表示,那么,为什么要采用这样奇怪的方式来编码,答案是将编码后的数字进行同样规则的编码,就可得到原来的数字,这就是使用补码表示的其中一个好处。

我们对-8的二进制补码表示1111 1000进行除第一位取反,得到1000 0111,再加1,得到1000 1000,就是数字-8。因此我们可以得出32位表示正数的最大数为2^31-1,因此第一位始终是0,使用补码表示的第二个好处是只存在一个0,当不使用时1000 0000和0000 0000都可以表示0,因此很赘余,当使用补码表示时,只存在一个0,就是0000 0000,而1000 0000我们规定它来表示-2^8 = -128,它在二进制中比0111 1111大1,在这里32位就表示-2^31,因此这也解释了我们给一个值为2^31-1的int变量加1时,二进制为0111···111(31个1),没有得到2^31,因为它超过了int的上限,但也不是一个随机的数,答案是-2^31,二进制是1000···000(31个0)原因就是如此。如果我们定义一个unsigned int c,还是占用4个字节,但这时不考虑正负号,因此它的数据范围是[0,2^31]。这样规定的好处还在于,我们可以用加法来代替减法,比如5-8的二进制表示为0000 0101 - 0000 1000,补码表示为0000 0101 + 1111 1000,得到1111 1101,除第一位取反再加1得到 1000 0011,即是-3的二进制表示,即用加法实现了减法。





因此我们得出补码表示法进行运算的几个优点:
1.减法运算可以用加法来实现,即用求和来代替求差,数的符号位可以同数值部分作为一个整体参与运算;
2.只存在一个0的表示,避免赘余;
3.对一个数连续取其补码等于它本身,并且两数的补码之和(差)=两数和(差)的补码。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值