原理:
取补码的游戏规则:取反加一
取反之后,若末位为0【即原码末位为1】:
末位0变1,前面所有位保持反码数据状态不变
也就是说,若原码末位为1,执行操作:
末位不变,前面所有位取反
取反之后,若末位为1【即原码末位为0】:
末位1变0,向前进位
进入循环:
若前一位为0:
0变1,结束循环
若前一位为1,一样的:
1变0,向前进位,继续向前循环
直到出现(找到)“前一位为0”的情况为止
若原码末位为0,执行操作:
一直向前寻找,直到找到最末一位“1”(最末一位“1”代表着:这一位1后面的数字,全都为0)
保持最末一位“1”及其后面的数字不变
解释:
100...000取反加一
=>011...111加一
=>100...000
前面数字全部取反(保持反码的取反状态不变)
综上所述:
收纳上述总结论如下:
Case 1:
若原码末位为1,执行操作:
末位不变,前面所有位取反
Case 2:
若原码末位为0,执行操作:
一直向前寻找,直到找到最末一位“1”
保持最末一位“1”及其后面的数字不变
前面所有位取反 (保持反码的取反状态不变)
而实际上,根据我们的想法验证,Case 1即特殊的Case 2的情况,如此而已
最后,还有一点需要注意的是:
无论是我们在使用上述简便办法还是老老实实办法(取反加一)求补码的时候
执行的“取反”的操作针对的对象范围,仅限于(局限于)数值剩余剩下的数值位
不包含符号位!!!!
唯一需要将所有位(包括数值位和符号位)全部都取反的情况为:
将减数转化为加数
即:
已知 [ B ] 的补码,求 [ -B ] 的补码