3 回答

TA贡献1858条经验 获得超8个赞
没有+运算符byte。相反,两个操作数都被提升为int,因此您已经
byte = byte + byte
... becomes (widening to find + operator) ...
byte = int + int
... becomes (result of + operator) ...
byte = int
...然后失败,因为没有从int到的隐式转换byte。您需要强制转换:
byte a = 1;
byte b = 2;
byte c = (byte) (a + b);
这是JLS的5.6.2节中数字推广的实际规则:
当运算符将二进制数值提升应用于一对操作数时,每个操作数必须表示一个可转换为数字类型的值,以下规则适用,以便根据需要使用加宽转换(第5.1.2节)来转换操作数:
如果任何一个操作数是引用类型,则执行装箱转换(第5.1.8节)。然后:
如果一个操作数的类型为double,则另一个将转换为double。
否则,如果其中一个操作数的类型为float,则另一个将转换为float。
否则,如果其中一个操作数的类型为long,则另一个将转换为long。
否则,两个操作数都将转换为int类型。

TA贡献1155条经验 获得超0个赞
为您提供了有关自动升级为“ int”的正确答案。
还有一点需要注意的是-复合赋值运算符的行为是隐式类型。例:
byte b1 = 1;
byte b2 = 2;
b1 = b1 + b2; // compilation fails
b1 += b2; // compilation successful

TA贡献1802条经验 获得超4个赞
要理解这一点,您应该参考以下两点:
隐式转换:字节(8位)->短(16位)->整数(32位)->浮点(32位)->双(64位)字符(16位)->整数(32位)
算术运算符规则
运算符优先级规则:该规则指出(*,/,%)组将首先被评估。然后将对(+,-)组运算符进行评估。在同一组运算符中,从左侧进行计算。
操作数提升规则:此规则指出,数据类型小于int的操作数将被提升为int。升级顺序(字节->短->整数,字符->整数)
相同类型操作数规则:该规则指出,如果两个操作数均为int,long,float,double,则将相同类型携带到结果类型。即long + long => long,float + float => float,int + int => int
混合类型操作数规则:如果任何操作数来自上述顺序,则遵循升序(int-> long-> float-> double)的顺序,然后将较小的值提升为较大的值,并以较大的类型计算结果。即long + double => double,int + long => long
添加回答
举报