机器数、原码、反码、补码
计算机使用补码进行数字的存储和运算,本文假定机器的字长为8位,探讨下机器数、原码、反码、补码之间的关系
机器数和真值
机器数
- 计算机中一个数的二进制表示形式,称为这个数的机器数
- 机器数带符号,在计算机中,用一个数的最高位存放符号,称为符号位,0表示正数,1表示负数
例:
1
的机器数为00000001
,-1
的机器数为10000001
。此处的00000001
、10000001
即为机器数
真值
- 带符号位的机器数表示的真实数值称为机器数的真值
- 因为机器数的最高位为符号位,因此机器数表示的形式值并不一定等于真正的数值(
10000001
转换为十进制为129
,并不代表机器数的真正数值,真值为-1
)例:
00000011
的真值为3
,10000011
的真值为-3
原码、反码、补码
原码、反码、补码为机器数表示的三种形式,正数的原码、反码、补码都是其本身
原码
原码就是机器数真值的绝对值加上符号位。也就是最高位为符号位,其余位表示数值
[+1]原 = 0000 0001
[-1]原 = 1000 0001第一位为符号位,其表示范围
[1111 1111, 0111 1111]
十进制值为
[-127, 127]
反码
- 在原码的基础上,正数的反码是其原码本身,负数的原码为符号位不变,其余位取反
[+1] = [0000 0001]原 = [0000 0001]反
[-1] = [1000 0001]原 = [1111 1110]反
补码
- 在原码的基础上,正数的补码也是其原码本身,负数的补码为符号位不变,其余位取反后+1,及反码+1
[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补
[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补
补码计算
1 - 1 = 0
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补 = [0000 0000]原 = 0
(-127) + (-1) = (-128)
(-127) + (-1) = [1111 1111]原 + [1000 0001]原 = [1000 0001]补 + [1111 1111]补 = [1000 0000]补 = -0
在用补码运算的结果中,规定 [1000 0000]
补就是-128
,实际上是使用以前的-0
的补码来表示-128
,所以-128
并没有原码和反码表示
- 因此补码表示范围
[1000 0000, 0111 1111]
十进制值为
[-128, 127]
例如:Java中基本数据类型int为4个字节,32位,可表示的范围:[-231, -231 - 1]