解释
这是补码表示法的一个例外,即当符号位为1而数值位全部为0时,它表示整数-2^(n-1),此时符号位的1既表示负号又表示数值。
0x80的八位补码表示法的原码为1'1000'000=-128(最高位是符号位)
0x80的十六位补码表示法的原码为1'1000'000'000'000=-32768
补码的计算
如果机器字长为8(8个二进制表示一个数),则
- 原码:最高位是符号位,其余位是数值位
- 反码:原码的符号位不变,数值位取反
- 补码:反码+1
注意
- 原码、反码、补码都是为了表示有符号数。
- 正数的原码、反码、补码都一样,负数的原码、反码、补码各不同。所以接下来只讨论非正数。
- 数值0的原码、反码有两种表示方法,补码只有一种表示方法。(0的原码:0000'0000、1000'0000,0的反码:0000'0000、1111'1111,0的补码:0000'0000)
- 补码表示是唯一的,所以补码0x80=1000'0000肯定不是0。
方法1
以-1为例
-1的原码是(最高位是符号位,低位是数值)
1000'0001,
-1的反码是(符号位不变,数值位取反)
1111'1110
-1的补码是(反码+1)
1111'1111
问题来了
怎么从补码计算原码?
答案是(反码+1)
1111'1111的反码:1000'0000
1111'1110的补码=反码+1=1000'0000+1=1000'0001
结论
补码的补码是原码
验证
以-2、-3为例
-2原码:1000'0010,反码:1111'1101,补码:1111'1110
1111'1110反码:1000'0001,补码:1000'0010=-2
-3原码:1000'0011,反码:1111'1100,补码:1111'1101
1111'1101反码:1000'0010,补码:1000'0011=-3
计算补码0x80的原码
0x80=1000'0000,反码:1111'1111,
可以看到计算补码时产生了进位,所以把数值扩展到八位(最高位还是符号位)
补码:1'1000'0000=-128
方法2
补码的引入是为了用加法计算减法。
可以看成只能显示个位的计算器,加号键还是坏的。
这种情况下怎么做减法运算呢?
以计算5-3为例
想到可以用加法的方式:5+7=2(十位显示不出来)
那么就称7是-3的补码。
补码怎么计算
首先,引入模的概念,模=数值最大值+1
这种情况下,模=9+1=10
补码就好定义了,补码的数值=模-减数
-1的补码值是10-1=9;
-2的补码值是10-2=8;
...
-8的补码值是10-8=2;
-9的补码值是10-9=1;
二进制的补码
八位二进制为例。最高位为符号位,低七位是数值数,则模=111'1111+1=1000'0000=128
那么-3的补码值就是128-3=125,加上符号位就是补码,二进制表示为1111'1101
测试一下:10-3=0000'1010+1111'1101=0000'0111=7
这就实现了减法的计算
补码0x80的原码
因为补码的补码是原码
那么0x80=1000'0000,符号位是1表示为负数,数值位等于0,其补码就是1000'0000-0=128,所以0x80的原码是-128