我知道iload接受的是-1到5的整数,但是如何使用bipush指令扩展到更高的数字?如何将特定整数与字节码一起存储?
最佳答案
有几种不同的指令可用于推送整数常量。
最小的是iconst_ *指令。这些只是一个字节,因为该值是在操作码本身中编码的。 iconst_1,iconstst_2等是不同的操作码。例如,iconst_5
将被编码为字节08
。
注意:iload
是完全不相关的指令,用于加载局部变量的值。您一定在想过icont_ *。
接下来是bipush
,它可以在-128到127之间推送一个常数。该指令的长度为两个字节-第一个字节为操作码,第二个字节为带符号的8位整数。您甚至可以使用它在-1到5范围内推送常量,尽管这样做会在类文件中占用不必要的空间。例如,bipush 5
将被编码为10 05
。 (0x10是bipush的操作码)
接下来是sipush
,除了它存储16位常量而不是8位常量之外,其他都是相同的,因此该指令的长度为3个字节。 sipush的操作码为0x11,因此sipush 5
将被编码为三字节序列11 00 05
。
您可能想知道如何存储不适合16位的整数常量。在这种情况下,编译器会在类文件的单独部分(称为常量池)中创建条目,然后使用ldc
或ldc_w
指令引用常量池条目。