无法从int转换为字节

时间:2015-06-02 11:36:04

标签: java casting integer byte

我有一个相当简单 - 但对我来说很困惑 - 问题。 假设字节变量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如何处理这方面......?

3 个答案:

答案 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的值进行操作的指令来正确执行。