我有一个相当简单 - 但对我来说很困惑 - 问题。 假设字节变量a,b,c:
byte a = 5;
byte b = 3;
byte c = a + b; // wont compile
第3行不会编译,因为 - 我想 - Java必须在幕后进行计算,计算结果是整数。在没有显式转换的情况下,不能将整数传递给字节。所以应该提供(字节)(a + b)。但现在假设存在第四行代码,其中显式转换为整数...
c = (int) 8 ; // compiles
它编译虽然字节变量' c'显式转换为整数。 Java如何处理这方面......?
答案 0 :(得分:1)
您未能看到的是a+b
是运行时操作,而byte b = (int)8;
是编译时操作。因此,在编译期间,编译器知道常量8
可以适合一个字节。因此,显式转换为(int)
忽略。字节代码与(int)
无差别。
现在,在第一种情况下,如果两个字节变量都是final
(即常量),那么编译器就允许这样做:
public static void main(String[] args) {
final byte a = 5; // constant
final byte b = 3; // constant
byte c = a + b; // WILL compile;
}
答案 1 :(得分:1)
第3行不会编译,因为 - 我想 - Java必须在幕后进行计算,计算结果是整数。
正确。
但是现在假设存在第四行代码,其中显式转换为整数
c = (int) 8 ; // compiles
虽然字节变量'c'被明确地转换为整数,但它编译。</ p>
因为你使用了文字值8
,编译器知道8
适合byte
。
更好的比较是:
c = (int)b;
......失败了。
答案 2 :(得分:0)
点是字节是8位,int是32位整数值。因此,例如,当您在127下添加两个字节数时,那么可以添加超过127的结果,这超出了字节范围,并且默认情况下Java几乎对所有数字使用int。
JVM doc说:
编译器使用Java虚拟机指令对字节和字节类型的文字值进行编码,这些指令在编译时或运行时将这些值签名扩展为int类型的值。 boolean和char类型的文字值的加载使用在编译时或运行时将文字零扩展为int类型的指令进行编码。 [..]。因此,对实际类型boolean,byte,char和short的值的大多数操作都可以通过对计算类型int的值进行操作的指令来正确执行。