这个问题在这里已经有答案了:
java中的乘法运算产生负值(4个答案)
四年前关门了。
对java还比较陌生,可能还有一些愚蠢的问题。代码如下:
long a = 3232235521L;
long b = 192 * 16777216 + 168 * 65536 + 0 * 256 + 1;
System.out.println("a="+a);
System.out.println("b="+b);
输出:
a=3232235521
b=-1062731775
根据java文档,long的最大值为2^63-1,即:9223372036854775807。所以对于b,没有溢出,为什么b不是3232235521?
3条答案
按热度按时间yyyllmsg1#
在代码的第2行中,所有操作数都是整数,这就是为什么操作的结果也是整数。
由于结果(3232235521)不适合整数(最大值为2^31-1),因此会导致整数溢出,这就是为什么会得到负结果。
因此,您需要使用长文本来获得准确的结果。将第2行改为下面的代码。
上面的代码应该为您提供正确的输出。
hjzp0vay2#
您在数学过程中使用整数原语,它只在整数溢出之后的最后转换。您可能需要使用192l16777216l+168l65536l+0l*256l+1l;
qncylg1j3#
你只需要在赋值中转换为long,直到那一点,所有的东西都是整数,这就是为什么你在计算过程中看到溢出。
代码应为:
long b = 192l * 16777216l + 168l * 65536l + 0l * 256l + 1l;