【JVM】数字在JVM中的表示

421 阅读3分钟

整数在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