补码的算术移位
将[X] 补的符号位与数值位一起右移一次并保持原符号位的值不变,可实现除法功能(除以2),即[X/2]补= X0X0X1X2…Xn-1Xn。今考虑X为正、负数两种情况。
设: X= 0.0110, [X]补=00110,右移一位得00011,是X除以2的补码结果。
设: X=-0.0110,[X]补=11010,计算 [X/2]补=11101,再按④求真值得X/2=-0.0011,说明得到的确实是X除以2的结果。
为了得到一个数的补码表示,当然可以通过补码的定义求得,但更简便的办法是:
当X≥0时,[X]补的符号位取0,数值位取X的各数值位上的值,此时有[X] 补=[X] 原。
当X<0时,[X]补的符号位取1,将X的各数值位取反(0变1,1变0)再在最低位加1,以得到 [X]补的各数值位上的值。
从[X]原求 [X] 补时,对正数或零,有[X] 补=[X]原,对负数,是符号位不变,各数值位变反后再在最低位执行加1操作。同理,由[X]补求 [X]原时,对负数仍是符号位不变,各数值位变反后再在最低位执行加1操作。
在说明补码的性质(3)时,特别强调两个数的补码相加,仅在其运算结果不超出机器能表示的数值范围时,运算结果才是正确的,否则得到的结果不正确。如 [X]补+[Y]补=01001+01010=10011。两个大于0.5的正数相加,结果的符号位变成负号,数值部分也是错误的。这是因此参加运算的两个数的和大于1,超出了机器所能表示的范围,产生了所谓的 "溢出"。对负数也会产生溢出,如[X]补+[Y]补=10101+10100=01001,两个负数相加,结果的符号位却变成正号,说明结果是错误的。
汇编语言里有