问题:
用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没有原码 )。