计算机原理之原码反码补码

Posted by 杨一 on 2020-03-28

原码

原码:最高位为符号位,其余各位为数值本身的绝对值。

正数的原码是其绝对值。

负数的原码即是其绝对值的原码再将其第一位变为1。

反码

正数:反码与原码相同。

负数:符号位为1,其余位对原码取反。

补码

计算机内存存储整数都是采用整数的补码形式表示,最高位直接表示是 符号位:0 表示正数 1表示负数。

比如Java的byte类型存储(8位):最大值2^7-1 :0111 1111; 最小值是-2^7 : 1111 1111

正数的补码:为这个数的2进制码,例如3:0000 0101

负数的补码:为这个负数的绝对值的2进制码,取反加1,

例如-3:

3的2进制码取反为: 0000 0011 -> 1111 1100

加1:1111 1101

所以-3的补码是:1111 1101

从内存中取出补码计算这个数:

  1. 从一个正数的补码计算这个正数。
    例如0000 0101:因为符号位是0,所以是正数,所以直接计算这个正数就行了,所以结果是 3

  2. 从一个负数的补码计算这个负数。例如-3:1111 1101:
    因为符号位(最高位)为1,所以表示这个数是负数
    用补码取反加1为这个负数的绝对值整数值:0000 0010 + 1 => 0000 0011 => 3
    所以1111 1101的值为-3

例如:

byte b = 127;

b = (byte) (b + 1);

最后b的值是多少?

127的二进制为: 0111 1111

127+1则为:0111 1111 + 1 = 1000 0000

所以当取出计算1000 0000的值时,

最高位为1,所以是负数

取反加1:0111 1111 + 1 = 1000 0000

计算1000 0000的值:128

结果:128的负值,所以为-128,即byte类型的127加1的值为-128