有符号类型的最小负数的补码的由来

一、 16位的有符号整数(int)

在计算机中是用补码存储数据 为什么不用原码存 就是因为原码表示不了最小值-32768
如果是原码表示的话,编码中+0是用16个0表示,-0是用1后跟15个0表示
但是由于+0等于-0所以相当于多花了一个编码来编码0

那么用补码会怎样

补码+0编码出来是16个0
-0 = [1000 0000 0000 0000] = [1111 1111 1111 1111] = [(1)0000 0000 0000 0000]
其中1溢出不管了 剩下的是16个0与+0编码相同

这样一来用16位进行编码如果按原码编码可以覆盖-32767~ 32767[1111 1111 1111 1111~0111 1111 1111 1111]
而用补码编码只覆盖到[1000 0000 0000 0001 ~ 0111 1111 1111 1111]其中[1 0000 0000 0000 000] 用不到
于是规定了用它表示最小值-32768

因此,在考虑16位有符号整数时,-32768只有补码[1000 0000 0000 0000],没有原码,只是硬性规定补码[1000 0000 0000 0000]表示
-32768
当然如果你考虑的是大于16位来编码的话,-32768肯定能正常编码,-32768 的正常编码如下:
源码 1 1000 0000 0000 0000
反码 1 0111 1111 1111 1111
补码 1 0111 1111 1111 1111
+ 1
=1 1000 0000 0000 0000
所以正常的-32768的补码应该是要17位表示,为1 1000 0000 0000 0000

二、 8位的有符号整数(int)

8位,即2^8=256,8位可以表示256个数值。
因为正数的原码、反码和补码相同,即[0000 0001] ~ [0111 1111] 表示正数的范围为1到127;

+0和-0的补码相同,都为[0000 0000],即都用这一个补码表示;

-1的补码:[1000 0001]=[1111 1110]=[1111 1111]

-127的补码:[1111 1111]=[1000 0000]=[1000 0001]

所以现在表示-127 到 127 的补码范围为(共255个数值):
[1000 0001] ~ [0111 1111], -127 ~ 127 之间的值的补码就在这个补码范围之间。
而8位是可以表示256个数值的,即还有一个补码没用到,根据上述范围描述可知,是[1000 0000] 没用到。
故规定用[1000 0000] 表示-128 -------emm,不浪费任何可用资源哦。

补充:

负数补码符号位为1,再另加7位,而7位的可能排列组合为2^7=128;
同理正数的补码符号位是0,再另加7位,7位的可能排列组合也是2^7=128;
所以,正负数补码的可能排列组合之和就是128 + 128 = 256,与开头计算的8位能表达的可能数值为2^8=256结果一致。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值