用Java推广?

提升的规则是“当操作数是不同类型时,会发生自动二进制数值提升,将较小的操作数类型转换为较大的操作数”。但是操作数是同一类型的


byte=byte+byte // Compile time error... found int..

那为什么会这样呢?


万千封印
浏览 246回答 3
3回答

猛跑小猪

没有+运算符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类型。

白衣非少年

为您提供了有关自动升级为“ int”的正确答案。还有一点需要注意的是-复合赋值运算符的行为是隐式类型。例:byte b1 = 1;byte b2 = 2;b1 = b1 + b2; // compilation failsb1 += b2; // compilation successful

慕虎7371278

要理解这一点,您应该参考以下两点:隐式转换:字节(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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java