我们知道,一个数在计算机中使用二进制来表示的。以下都用一个字节来表示二进制的存储。例如:+1表示成二进制为00000001,-1表示成二进制为10000001.两个正数相加计算机来十分方便,但是如果是一个数减去一个数会有正负之分,此时要比较出绝对值最大的那个数,然后加上符号位。这样子做也太麻烦了,会让计算机的硬件消耗更多的处理。
如果把一个数减去一个看作是两个数相加,例如1+(-2),这样子计算机只要能处理加法就好了,就不需要比较两个数的绝对值大小的问题,所以反码就出现了。正数的反码就是本身,负数的反码是除符号位之外取反。例如:+1的反码是00000001,-1的反码是11111110。1+(-1)=00000001+11111110=10000000。用反码计算计算机是快速了很多,但是会存在+0和-0的问题。它们两者都是一个数,却用了两个二进制反码来表示它。很奇怪。
所以就产生了二进制的补码。二进制的补码是在二进制反码的基础上加上1。正数的二进制补码就是二进制原码本身。所以+1的补码为00000001,-1的补码为11111111。+1+(-1)=00000001(补)+11111111(补)=00000000(补)=0(十进制)。
同时,用二进制补码的方式来存储一个十进制的数还能多表示一个数。例如:-1+(-127)=10000001(原码)+1111111(源码)=11111111(补码)+10000001(补码)=10000000(补码)=-128(十进制)。显然,如果用源码来表示那么一个字节的存储的数值为-127-127,如果用反码来表示一个字节存储的数值为-128-127.所以这也就是为什么用源码和补码一个字节表示的数值的范围不同的原因。
二:二进制源码反码补码的运算关系正数的源码反码补码相同。
反码=源码除符号位外取反
补码=反码+1