下面的代码使foo值为-1149239296
i。即integer
超出范围的值:
int bar = 3000;
long foo = bar * 1024 * 1024;
似乎Java
获取了第一个参数的type
,并尝试使用type
返回公式结果。
在Java
规范中哪个人可以阅读该故事?
我提出了这样的建议原因
int bar = 3000;
long foo = (long)bar * 1024 * 1024;
实际上会将long
值设置为foo
。
答案 0 :(得分:0)
对于这种情况,将任何int
文字投射到long
都可以。但是对于较长的操作链,中间某处可能出现溢出,关联性很重要。根据{{3}},*
运算符是左关联的,因此第一个文字应该是long
,以避免从一开始就溢出int
。其他与数学相关的运算符也是左关联的。
只有一个文字是long
是必要的原因是因为二进制数字促销,JLS Section 15.17,它会将较窄的类型提升为更宽的类型,至少int
。