概念:

原码,是自然数值的机器数表示。具体的表示规则是这样的:最高为作为符号位,剩下的位是数值位。比如-3原码表示为10000011(如图)。原码的数值表示范围跟二进制的位数有关,如8位二进制数最大的表示范围是-127~+127之间(最高位是符号位)。

反码,是机器数运算过程的中间表示形式。具体规则是:正数的反码和原码相同;负数的反码是符号位不变,其他位按位求反得到的。如,-3的补码是11111100。

补码,是机器数的运算表示形式。引入了补码克服了原码的局限性(由于符号位要单独操作,运算方法比较复杂),使得计算减法可以用计算加法的方式得到;补码另外的优点是,数字0补码表示的唯一性。具体的规则是:正数的补码和原码相同;负数的补码是反码末位加1。如,-3的补码是11111101。

然后,运算器对数值进行右移操作,负数补1,正数补0,得到11111111。从符号位看,代表的是负数,还原成原码方法是求补码的补码,得到原码10000001,代表十进制数-1。

总结一下:

正数的原码,反码和补码相同。

负数的反码是原码保持符号位不变,其他位按位求反;补码是反码加1。补码还原是补码的补码。

左移操作即所有的高位舍去(包括符号位),右边(低位)补0;右移操作,所有的低位舍去(右移),高位(左边)负数补1,正数补0。

 

因果:

引入原码 反码 和补码的目的就是为了解决减法问题,因为计算机CPU的运算器中只有加法器,要把减法转化成加法来计算。

举个例子,A表示十进制数“+16”,B表示十进制数“-19”,把这两个数的原码直接相加,得:

A=+16 (A)原=00010000
B=-19 (B)原=10010011

00010000 +
10010011
————
10100011

其结果符号位为1是负数,其数值位为100011,即等于十进制数“-35”,这显然是错的结果。

再比如,十进制数“+16”与“+19”的原码直接相减,得:

00010000 -
00010011
————
11111101

结果为“-125”,这又是错的。

但是引入补码后,加减法都可以用加法来实现,如“-16+11”的运算:

11110000 +     -16的补码
00001011        11的补码
————
11111011        -5的补码

如果是“-16-11”,那么就转化为加法运算“-16+(-11)”

11110000 +     -16的补码
11110101       -11的补码
————
111100101      -27的补码

在字长为8位的系统中,最高位所产生的进位被自然丢弃,运算结果的机器数为11100101,是-27的补码形式,结果正确。

顺便告诉你一些其它的东西:
1.二进制数中,两数的补码之和等于两数和的补码。
2.补码=反码+1
3.反码=原码除符号位外其它数值取反(即该数的绝对值取反),即“0”变“1”,“1”变“0”。
4.任何正数的原码 反码 补码的形式完全相同(即都是自身,不变)
5.在计算机中,有符号的数都是采用补码来表示的。
6.计算的时候,符号位也参与运算。