相对较新的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文档最长值为2 ^ 63-1,即:9223372036854775807。因此对于b,没有溢出,所以为什么b不是3232235521?
答案 0 :(得分:0)
您在数学运算期间使用整数基元,并且仅在整数溢出后在结束时进行转换。您可能想使用192L * 16777216L + 168L * 65536L + 0L * 256L + 1L;
答案 1 :(得分:0)
在代码的第2行中,所有操作数都是整数,这就是操作结果也是整数的原因。
由于结果(3,232,235,521)不适合整数(最大值为2 ^ 31 - 1),因此会导致整数溢出,这就是您得到否定结果的原因。
因此,您需要使用Long文字来获得准确的结果。将第2行更改为以下代码。
long b = 192L * 16777216L + 168L * 65536L + 0L * 256L + 1L;
上面的代码应该能为您提供正确的输出。
答案 2 :(得分:0)
你只是在转让时进行了长时间的转换 - 直到那一切都是一个整数,这就是你在计算中途看到溢出的原因。
代码应为:
long b = 192l * 16777216l + 168l * 65536l + 0l * 256l + 1l;