gpt4 book ai didi

java - Bipush 在 JVM 中如何工作?

转载 作者:行者123 更新时间:2023-12-02 07:58:58 26 4
gpt4 key购买 nike

我知道 iload 接受整数 -1 到 5,但是如何使用 bipush 指令扩展到更高的数字?特定整数如何与字节码一起存储?

最佳答案

有几种不同的指令可用于推送整数常量。

最小的是iconst_*指令。这些只是一个字节,因为该值是在操作码本身中编码的。 icont_1、iconst_2 等是不同的操作码。例如,iconst_5 将被编码为字节08

注意:iload是一条完全不相关的指令,用于加载局部变量的值。您一定想到了 icont_*。

接下来是bipush,它可以推送-128到127之间的常量。这条指令有两个字节长——第一个字节是操作码,第二个字节是有符号的8位整数。您甚至可以使用它来推送 -1 到 5 范围内的常量,尽管这样做会在类文件中占用更多的空间。例如,bipush 5 将被编码为 10 05。 (0x10是bipush的操作码)

接下来是sipush,它是相同的,只是它存储的是 16 位常量而不是 8 位常量,因此指令是三个字节长。 sipush 的操作码是 0x11,因此 sipush 5 将被编码为三字节序列 11 00 05

您可能想知道不适合 16 位的整数常量是如何存储的。在这种情况下,编译器在类文件的一个称为常量池的单独部分中创建条目,然后使用 ldcldc_w 指令来引用常量池条目。

关于java - Bipush 在 JVM 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50167675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com