为了账号安全,请及时绑定邮箱和手机立即绑定

用Java推广?

用Java推广?

万千封印 2019-11-19 14:31:40
提升的规则是“当操作数是不同类型时,会发生自动二进制数值提升,将较小的操作数类型转换为较大的操作数”。但是操作数是同一类型的byte=byte+byte // Compile time error... found int..那为什么会这样呢?
查看完整描述

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类型。


查看完整回答
反对 回复 2019-11-19
?
白衣非少年

TA贡献1155条经验 获得超0个赞

为您提供了有关自动升级为“ int”的正确答案。


还有一点需要注意的是-复合赋值运算符的行为是隐式类型。例:


byte b1 = 1;

byte b2 = 2;

b1 = b1 + b2; // compilation fails

b1 += b2; // compilation successful


查看完整回答
反对 回复 2019-11-19
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

要理解这一点,您应该参考以下两点:

隐式转换:字节(8位)->短(16位)->整数(32位)->浮点(32位)->双(64位)字符(16位)->整数(32位)

算术运算符规则

  1. 运算符优先级规则:该规则指出(*,/,%)组将首先被评估。然后将对(+,-)组运算符进行评估。在同一组运算符中,从左侧进行计算。

  2. 操作数提升规则:此规则指出,数据类型小于int的操作数将被提升为int。升级顺序(字节->短->整数,字符->整数)

  3. 相同类型操作数规则:该规则指出,如果两个操作数均为int,long,float,double,则将相同类型携带到结果类型。即long + long => long,float + float => float,int + int => int

  4. 混合类型操作数规则:如果任何操作数来自上述顺序,则遵循升序(int-> long-> float-> double)的顺序,然后将较小的值提升为较大的值,并以较大的类型计算结果。即long + double => double,int + long => long


查看完整回答
反对 回复 2019-11-19
  • 3 回答
  • 0 关注
  • 245 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信