如何在Java中打印长基元

时间:2016-05-10 10:40:38

标签: java overflow long-integer

相对较新的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?

3 个答案:

答案 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;