为什么用二进制补码所能表示的数据范围比原码多一个数据单位(为什么8位二进制的补码取值范围是-128~127)

问题:

用8位二进制表示机器数[一个符号位]
原码表示的范围 -127 ~ +127
而用其补码表示则是 -128 ~ +127 (1000 0000~0111 1111)
为什么用二进制补码所能表示的数据范围比原码多一个数据单位
为什么8位二进制的补码取值范围是-128~127
为什么1000 0000就是表示 -128

回答:

因为有一位是符号位,所以后7位是数值位。
2^7=128,所以正数和负数各有127个(但是机器中是有0的,而且“0”有“+0”和“-0”之分)
所以,
正数是从 +0 ~ +127,刚好128个数字;
负数是从 -127 ~ -0,也刚好128个数字。

但是在补码中没有 +0 、-0 之分,所以,可以简单理解 (当然这是不正确的) 为-0这个位置空了出来,因此就在负数的区域中多出一位,把这一位进行平移,由原来的 -127 ~ -0,变成 -128 ~ -1,也还是128位。

正确的理解:
八位二进制正数 [ 0000 0000(0) ~ 0111 1111(127) ] 的补码(与原码相同)范围是0000 0000 ~ 0111 1111
八位二进制负数 [ 1111 1111(-127) ~ 1000 0000(-0) ] 的补码(原码化为反码末尾再加一)范围为 1000 0001 ~ 1 0000 0000

因为是一个字节(八位二进制),所以 -0 的补码 1 0000 0000 溢出,所以舍去(所以补码中只有一个 0 ,解决了原码中有 +0 、-0 两个 0 的问题)。
再观察补码的范围 0000 0000 ~ 0111 1111 、1000 0001 ~ 1111 1111 ,可以发现补码为 1000 0000 是没有定义的,又因为补码中舍去了 -0 ,所以补码中少了一个负数,所以将 1000 0000 定义为 -128 的补码( -128没有原码 )。

参考资料

为什么8位二进制的补码取值范围是-128~127

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值