原码
原码:最高位为符号位,其余各位为数值本身的绝对值。
正数的原码是其绝对值。
负数的原码即是其绝对值的原码再将其第一位变为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
从内存中取出补码计算这个数:
-
从一个正数的补码计算这个正数。
例如0000 0101:因为符号位是0,所以是正数,所以直接计算这个正数就行了,所以结果是 3 -
从一个负数的补码计算这个负数。例如-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