补码的产生原因
在计算机实现加法的运算逻辑之后,再用其他方式实现减法运算较为麻烦。所以加法运算的逻辑实现减法运算。
解决方案
类似于钟表,表针一圈圈的转,转到最大值时归0。补码的预算方式也是这样,例如计算4-1。
4-1
->4+[-1]补
->即表针转完一圈后少转一格
->4+(12-1)
-> 4
+a (此次用12进制表示:a为10,b为11)
--------
13
因为钟表为1位12进制,所以1被舍去
->3
12-1=11-1+1,这个就是12进制的取反加1进行的运算。
取反就是用取值范围内的最大值-去当前值
例如
在一位12进制数中取反就是用b-要取反的数
在两位12进制中就是bb-要取反的数
在三位二进制中就是111-要取反的数(011取反为100)
在取值范围内的最大值+1=当前无符号数的数量,这正好是一个轮回的数量。所以最后要进行加1操作。
溢出
溢出的原因
因为一为12进制数加上符号位能表示的范围为-12~+11,得出的结果超过了这个范围就出现错误。
溢出的判断
首先在同符号的数相加时才会有溢出情况(也就是负数加负数,正数+正数)。判断条件为
1.两个同号数得出结果的符号位与原符号不同;
2.符号位所进的值与数字位最高位所进的值不同;
3.双符号运算,两个符号位为异或关系。
个人总结:正数相加最高位进位代表溢出,负数相加最高位不进位代表溢出。
十进制 | -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
十二进制 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1a | 1b |
十进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
十二进制 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0a | 0b |
举例验证
符号位为二进制,数字位为12进制。
6+7:
06 006
+07 + 007
---------- -----------
13 013
-6-7:
15 115
+ 16 + 116
---------- -----------
10b 110b
二进制同理
补充说明:
1.补充方案里求补码的方式没有涉及符号位,带符号位的求补码方式为
正数:照抄
负数:符号位照抄,数字位取反加一