一 机器数和真值
1. 机器数
机器数带符号,计算机中用一个数的最高位存放符号,正数为0,负数为1。
十进制数 | 二进制数 | 机器数 |
---|---|---|
+3 | 00000011 | 00000011 |
-3 | 00000011 | 10000011 |
2. 真值
将带符号位的机器数对应的真正数值成为机器数的真值。
0000 0001 的真值 = +000 0001 = +1
1000 0001 的真值 = -000 0001 = -1
原码、反码、补码
1. 原码
原码 = 符号位 + 真值的绝对值,第一位表示符号,其余位表示值。
[+1]原 = 0000 0001
[-1]原 = 1000 0001
由于第一位是符号位,所以8位二进制的取值范围为[1111 1111, 0111 1111]
即 八位二进制数的原码范围[-127, +127]
2. 反码
反码的计算:正数的反码是其本身,负数的反码在其原码基础上,符号位不变,其余各位取反。
十进制数 | 原码 | 反码 |
---|---|---|
+1 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 |
3. 补码
补码计算:正数补码是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(在反码基础上+1)
十进制数 | 原码 | 反码 | 补码 |
---|---|---|---|
+1 | 0000 0001 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
System.out.println(Math.abs(-2147483647)); //输出: 2147483647
System.out.println(Math.abs(-2147483648)); //输出:-2147483648
int i = 2147483647;
System.out.println(i + 1); //输出: -2147483648