整数在JVM中的表示
JVM中整数有byte、short、int、long,分为对应8位、16位、32位、64位有符号整数。整数在计算机中使用补码表示。
原码
原码就是符号位+数字的二进制表示。
以int为例,第一位为符号位,0是整数,1是负数。其余31位是数字的二进制值。
10的原码是 00000000 00000000 00000000 00001010
-10的原码是 10000000 00000000 00000000 00001010
反码
反码就是在原码的基础上,符号位不变,其余位取反。
10的反码是 01111111 11111111 11111111 11110101
-10的反码是 11111111 11111111 11111111 11110101
补码
正数的补码是原码本身,负数的补码是反码加1
10的补码是 00000000 00000000 00000000 00001010
-10的补码 11111111 11111111 11111111 11110110
使用补码的好处
相对于原码,使用补码作为计算机内的实际存储方式至少有以下两个好处。
好处一:统一数字0的表示
0既非整数也非负数,如果用原码表示时,符号位难以确定。
如果用补码的话,无论把0归为正数或者负数都会得到相同的结果
当0为正数,补码是原码本身:00000000 00000000 00000000 00000000
当0位负数,补码是反码加1
负数0的原码为:10000000 00000000 00000000 00000000
反码为:11111111 11111111 11111111 11111111
补码为反码加1,结果为:00000000 00000000 00000000 00000000
好处二:简化整数的加减法计算
使用补码可以将减法计算视为加法计算,实现加减法完全统一。以8位(byte)为例
计算-6 + 5过程。
- -6 补码:1111 1010
- 5 补码:0000 0101
- 直接相加得:1111 1111
- 符号位为1 表示负数,反推出反码等于补码加1,
- 即反码为 1111 1110
- 原码为 1000 0001
- 得出结果为:-1。
计算 4 + 6 过程。
- 4的补码:0000 0100
- 6的补码:0000 0110
- 直接相加得:0000 1010
- 符号位为0 表示整数,补码等于原码本身
- 即原码为0000 1010
- 得出结果为:10