一.基础名词
原码 : 0011
反码 :
0011(原码) >> 1100(反码) (原码按位取反)
补码 :
0011(原码) >> 0011(补码) (正数的补码是自己)
-0101(原码) >> 1011(补码) (负数的补码是原码按位取反加一)
二.补码作用
1.将减法转化成加法
因为运算器进行加法是最快的.
2.用二进制数表示负数
计算机只识别0和1.不认识负号和正号.如1011表示-5
三.例子
计算机内部运算减法的时候其实是转成加法来运算的.
例子一:
我们先来看十进制下怎么将减法转成加法:
如34-12可以进行如下转换
34 - 12
= 34 + ( -12 )
= 34 + ( -12 ) + 99 + 1 - 100
// 1.(99 - 12 + 1)即求补数.
// 在十进制里求补数还是用到了减法.
// 但是二进制求补数就不需要使用减法了.
// 2.此处的100高位溢出了.省略百位的1.即0;
= 34 + ( 99 - 12 + 1) - 100
= 34 + 88
// 此处的122高位溢出了.省略百位的1.即22
= 122
= 22
例子二:
然后我们再来看下二进制怎么将减法转成加法:
如0011 - 0001可以进行如下转换
0011 - 0001
= 0011 + (-0001)
= 0011 + (-0001) + 1111 + 0001 - 10000
// 1.( 1111 - 0001 + 0001) 即求补数.
// 但是1111-0001即对0001取反.
// 所以此处无需使用减法
// 2.此处的10000高位溢出了.省略最高位.即0000;
= 0011 + ( 1111 - 0001 + 0001) - 10000
// ( 1111 - 0001 + 0001) >> 1111 即对-0001取反加1
= 0011 + 1111
// 此处高位溢出.省略高位
= 10010
= 0010
// 转成十进制
= 2
总结: 二进制减法a-b 可以转化为 a + b的补码
例子三:
前面一个例子是大数减小数.
那现在我们用前面得出的结论来计算小数减大数
0001 - 0011
// -0011求补码即1101
= 0001 + 1101
// 符号位为1.即结果为负数.
= 1110
// 负数的原码: 保留正负号.求补码
= - (0010)
// 转成十进制
= -2