原码、反码、补码
前置知识
带余除法
设 x,m ∈ Z, m > 0则存在唯一决定的整数q和r, 使得 x = qm + r, 0 ≤ r < m。
也就是取模运算,即通过对m取模,根据r的不同来分成m类(0~m-1);
例如: -3 对 12 取模, −3=(−1)×12+9, 余数为9, 也即余数为9。
而且观察到, 若x是一个负数,且|x| ≤ m, 则 x 和 m - |x| 在 模m时 是等价的。
正题
1个字节是有8个二进制bit位, 共28种状态。 先不考虑符号问题,则取值范围在[0,28−1], 即使两个数相加相减过后实际数量超过这个范围也会被计算机硬件自动对28取模。
对于减法操作一般用加法替代(加减法需要不同的状态存储设计), 而现在我们的计算机加法操作后会强制做一个取模操作,所以减去1即(0000,0001)2的话,等价要加上-1
对应在[20,28−1]范围内的正数x, 使用刚才的公式, x = 模 - |-1|, 即 256 - 1 = 255,
对应二进制数(1111,1111)2。
对于减去2(0000,0010)2也就是加上 -2
对应在[0,28−1]范围内的正数x = 256 - 2 = 254, 二进制形式为(1111,1110)2;
不断增大被减数,当减去127时,(0111,1111)2也就是加上 -127
对应在[0,28−1]范围内的正数x = 256 - 127 = 129, 二进制形式为(1000,0001)2;
随着要去减的数绝对值不断增加,对应在[0,28−1]范围内的正数x 也在不断减小,直到128(1000,0000)2。
当我们要加-128
时,发现对应在[0,28−1]范围内的正数x = 256 - 128 = 128也就是(1000,0000)2, 和正的128相等。
减去129(1000,0001)2, 即256 - 129 = 127(0111,1111), 又回到了我们刚才的127,也就是127是-129的等价数,而129是-127的等价数。
也就是从128开始,数字对应的负数的等价又开始回去了,而又从128开始最高位开始为1,所以将以最高位为1的定义为负数,即最高位为符号位,0为正数,1为负数;即(1111,1111)2表示是-1, 但是为了方便计算对应的真实值(个人猜想),我们把符号位为1的二进制,尾数(即除了符号位)取反后再加1即表可以根据符号位为1,直接计算对应的负值。
没总结完,先写到这里,想到再补充。
2023.07.04 补充
负数对应的补码,可以把相应正数的补码按位取反(包括符号位),然后加1.