添加字节转换为int是因为java语言规则还是因为jvm?

添加字节转换为int是因为java语言规则还是因为jvm?,java,type-conversion,byte,operation,type-promotion,Java,Type Conversion,Byte,Operation,Type Promotion,抛出错误:可能会丢失精度 byte a = 1; byte b = 1; byte c = a + b; 这种行为是否与jvm有关,或者它是否是用java语言定义的 编辑:如果它是用java语言定义的,那么是因为记住了jvm吗 意思是如果java支持字节数据类型,那么为什么对字节进行操作结果int是的,这是语言规范 加法(+)运算符。添加时,'a'将转换(隐式强制转换)为int类型, b以及键入int。因此,result隐式地属于int类型 同样适用于-操作员。包括: 加宽基元转换(§5.1.

抛出错误:可能会丢失精度

byte a = 1;
byte b = 1;
byte c = a + b;
这种行为是否与jvm有关,或者它是否是用java语言定义的

编辑:如果它是用java语言定义的,那么是因为记住了jvm吗


意思是如果java支持
字节
数据类型,那么为什么对字节进行
操作
结果
int
是的,这是语言规范

加法(+)运算符。添加时,
'a'
将转换(隐式强制转换)为
int
类型, b以及键入
int
。因此,
result
隐式地属于
int
类型

同样适用于
-
操作员。

包括:

加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:

  • 如果任一操作数的类型为
    double
    ,则另一个操作数将转换为
    double

  • 否则,如果任一操作数的类型为
    float
    ,则另一个操作数将转换为
    float

  • 否则,如果任一操作数的类型为
    long
    ,则另一个操作数将转换为
    long

  • 否则,两个操作数都转换为类型
    int

如果java支持字节数据类型,那么为什么对字节的操作会导致int

因为Java虚拟机就是这样设计的。没有对字节类型执行操作的指令集。相反,
int
type的指令集用于对
boolean
byte
char
short
类型的操作

发件人:

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

该部分还详细说明了其原因:

考虑到Java虚拟机的单字节操作码大小,将类型编码为操作码会给其指令集的设计带来压力。如果每个类型化指令都支持Java虚拟机的所有运行时数据类型,那么将有比
字节所能表示的更多的指令。[…]根据需要,可以使用单独的指令在不支持和支持的数据类型之间进行转换

有关各种类型的所有指令集的详细信息,请参阅该部分中的表格


还有一个表指定实际类型到JVM计算类型的映射:

编译器正在做正确的事情。因为(a+b)可以超出字节变量中可以保留的最大值。如果你告诉编译器a,b值不会因为使用'final'关键字而改变,它就不会再抱怨了

byte subt = a_s - a_b;
                ^
  required: byte
  found:    int

对任何操作数执行算术运算时,结果以以下形式存储MAX(int、操作数1类型、操作数2类型、…操作数类型) 前任:

字节a=10;
字节b=20;
字节c=a+b

然后a+b的结果将以最大值的形式存储(int、操作数1类型、操作数2类型、…操作数类型) 在这种情况下 MAX(int,byte,byte)最大值是int,这是最大值,因此c将具有int值,但c已声明为byte,我们不能将int(较大)值存储到byte(较小)中。这同样适用于每个算术运算符

这就是为什么错误会说
错误:不兼容类型:从int到byte

的可能有损转换编译器正确,将变量声明为final或强制转换为byte:

final byte a = 1;
final byte b = 1;
byte c = a + b;
JAVA:byte+byte=int


:)

+1当JIT将代码优化为本机代码时,它可以使用它喜欢的任何类型。它不必是
int
类型。Java是否仍然能够将它们转换为
int
,执行操作,并将它们转换回
字节
?JLS规范似乎更适用,尽管这可以解释JLS这一部分背后的原因。@PeterLawrey本机代码是否与Java相关?我的意思是那可能是另一种语言。我说得对吗?“对JIT优化几乎一无所知。”杜克林。对int类型执行的二进制操作只会导致int类型。最终结果不是字节类型,因为结果可能不适合它。JLS可能不太适用,因为它没有解释JVM的内部结构,我想这正是OP想要的。@RohitJain本机代码将相互关联并产生相同的结果。具体如何达到JIT。如果由于某种原因(我对此表示怀疑),字节的加法速度更快,那么它就可以使用;导致错误。。。b+=a;编译成功。为什么?复合运算符(+=)像b=(字节)(b+a)一样转换结果;字节c=a+b;导致错误。。。b+=a;编译成功。为什么?@HarshGoswami请小心下溢或溢出。
byte b =  1;
byte c =  22;
byte a = (byte) (b + c);