1 计算机中数值都是按补码来存储的。
原码(原码是带符号位的):第一位表示符号位,0表示正数,1表示负数。符号位加上真值的绝对值
比如
0 0 0 0 0 0 0 1 表示正1
1 0 0 0 0 0 0 1 表示负1
反码:正数的反码就是原码, 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反(符号位不取反,数值位取反)
0 0 0 0 0 0 0 1 表示正1
1 1 1 1 1 1 1 0 表示负1
这时候就产生了一个问题,正零和负零用反码表示不一致,这样不合理
0 0 0 0 0 0 0 0 表示正0
1 1 1 1 1 1 1 1 表示负0
补码:正数的补码就是原码,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1(反码+1)
0 0 0 0 0 0 0 0 表示正0
0 0 0 0 0 0 0 0 表示负0
这样 0 0 0 0 0 0 0 0 表示零了,正零和负零统一了
补码的好处:
统一了0的表示
符号位也可以当作数值一样参与运算
八位字节,算上符号能够表示的范围是2^8=256个数。
-128 ~ 127 正好是256个数
补码 1 0 0 0 0 0 0 0 1 求原码 ,表示的数是 - 127
补码 1 0 0 0 0 0 0 0 0 求原码得出来的是0 0 0 0 0 0 0 0 ,这个是0的原码 。这时,人为规定补码 1 0 0 0 0 0 0 0 0 表示的值是-128
所以 0 0 0 0 0 0 0 0 表示零
1 0 0 0 0 0 0 0 表示-128
---------------------------------------------------------------------
原码和补码的相互转换
正数的补码与原码相同
9的补码是 0000 1001
负数的补码 ,先得到他的原码,再得到反码+1
-15 1000 1111 ===》 1111 0000 ===》 1111 0001
数0的补码表示是唯一的 0000 0000
已知补码求原码:
如果符号位是0 ,表示是一个正数,其原码就是补码
如果符号位是1 ,表示是一个负数,其原码是 符号位不变,其余位取反后加1
补码(1111 1001) 1000 0110 ==》 (原码)1000 0111