Java 无法从int转换为byte

Java 无法从int转换为byte,java,casting,integer,byte,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”显式强制转换为整数,但它仍会编译

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

您没有看到的是
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;

}

点是字节为8位,int为32位整数值。例如,当您在127下添加两个字节数时,这可以添加到超过127的结果中,这超出了字节的范围,默认情况下,Java对几乎所有的数字都使用int

报告说:

编译器使用Java虚拟机指令对byte和short类型的文本值进行编码,Java虚拟机指令在编译时或运行时将这些值扩展为int类型的值。boolean和char类型的文本值的加载使用在编译时或运行时将文本扩展为int类型的指令进行编码。[..]. 因此,对实际类型boolean、byte、char和short的值的大多数操作都是由对计算类型int的值进行操作的指令正确执行的

第3行不会编译,因为——我想——Java必须在后台进行计算,并且计算结果是一个整数

但现在假设有第四行代码显式转换为整数

c = (int) 8 ; // compiles
尽管字节变量“c”显式强制转换为整数,但它仍会编译

因为您使用了一个文本值,
8
,编译器知道
8
将适合
byte

更好的比较是:

c = (int)b;

…失败。

字节有自己的运算符。它们不是整数。看起来以前有人问过这个问题。看看[这里][1]?[1] :试试
c=(int)128
,你自己可能知道其中的区别!!