乐趣区

关于jvm:整数在java虚拟机中的表示

了解 Java 虚拟机整数示意的前置内容

在 Java 的虚拟机中,整数有 byte、short、int、long 四种,别离示意 8 位、16 位、32 位、64 位有符号整数。整数在计算机中用补码示意,在 Java 虚拟机中也不例外。在学习补码之前,必须先了解原码和反码。

原码

所谓原码,就是符号位加上数字的二进制示意。以 int 为例,第 1 位示意符号位(负数或者正数),其余 31 位示意该数字的二进制值。

10 的原码为: 00000000000000000000000000001010
-10 的原码为:10000000000000000000000000001010

对于原码来说,绝对值雷同的负数和正数只有符号位不同。

反码

反码就是在原码的根底上,符号位不变,对其余位取反,以 -10 为例,其反码为:

11111111111111111111111111110101

补码

正数的补码就是反码加 1,整数的补码就是原码自身。
因而,10 的补码为:

00000000000000000000000000001010

而 -10 的补码为

11111111111111111111111111110110

在 Java 中,能够应用位运算查看整数中每一位的理论值,办法如下:

1    public static void printBinary(int number) {2            for (int i = 0; i < 32; i++) {3                int t = (number & 0x80000000 >>> i) >>> (31 - i);
4                System.out.print(t);
5            }
6        }

以上代码将打印 -10 在虚拟机内的理论示意,程序的执行后果如下:

11111111111111111111111111110110

能够看到这个后果和之前的补码计算是齐全匹配的。
这段程序的根本思维是:进行 32 次循环(因为 int 有 32 位),每次循环取出 int 值中的第一位,第三行的 0x80000000 是一个 首位为 1、其余位为 0 的整数,通过右移 i 位,定位到要获取的第 i 位,并将除该位的其余位对立设置为 0,而该位不变,最初将该位移至最初,并运行输入。

绝对于原码,应用补码作为计算机内的理论存储形式至多有以下两个益处:

(1) 能够对立数字 0 的示意。因为 0 既非负数,又非正数,应用原码示意时符号位难以确定,把 0 纳入整数或者正数失去的原码后果是不同的。然而应用补码示意时,无论把 0 纳入负数还是正数都会失去雷同的后果。计算过程如下:

 如果 0 为负数,则补码为原码自身:00000000000000000000000000000000

如果 0 为正数,则补码为反码加 1,正数的 0 的原码为:10000000000000000000000000000000

反码为:11111111111111111111111111111111

补码在反码的根底上加 1,后果为:00000000000000000000000000000000

能够看到,应用补码作为整数编码,能够解决数字 0 的存储问题。

(2) 应用补码能够简化整数的加减法计算,将减法计算视为加法计算,实现减法和加法的齐全对立,实现负数和正数加法的对立。先应用 8 位(byte)整数阐明这个问题。

计算 -6+ 5 的过程如下:

- 6 的补码:11111010
5 的补码:00000101
间接相加得:11111111
通过计算可知,11111111 示意 -1

计算 4 + 6 的过程如下:

 4 的补码:00000100
6 的补码:00000110
间接相加得:00001010
通过计算可知,000001010 示意 10(十进制)。

能够看到,应用补码示意时,只须要将补码简略地相加,即可失去算术加法的正确后果,而无须区别负数或者正数。

退出移动版