【问题标题】:How to print long primitive in Java [duplicate]如何在Java中打印长原语[重复]
【发布时间】:2016-05-10 10:40:37
【问题描述】:

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?

【问题讨论】:

    标签: java overflow long-integer


    【解决方案1】:

    在代码的第 2 行中,所有操作数都是整数,这就是为什么运算结果也是整数的原因。

    由于结果(3,232,235,521)不适合整数(最大值为 2^31 - 1),这会导致 整数溢出,这就是您得到否定结果的原因。

    因此,您需要使用 Long 字面量来获得准确的结果。将第 2 行更改为以下代码。

    long b = 192L * 16777216L + 168L * 65536L + 0L * 256L + 1L;
    

    上面的代码应该会给你正确的输出。

    【讨论】:

    • long is 2^63-1 的最大值,那么它不适合??
    • 由于表达式的右侧只有整数,因此各个运算的结果将设置为整数。无论哪个结果不适合int,都会溢出。
    【解决方案2】:

    您在数学过程中使用了整数基元,它仅在整数溢出后在最后进行转换。您可能想使用 192L * 16777216L + 168L * 65536L + 0L * 256L + 1L;

    【讨论】:

      【解决方案3】:

      您只是在赋值中转换为 long - 直到此时所有内容都是整数,这就是为什么您在计算过程中看到溢出的原因。

      代码应该是:

      long b = 192l * 16777216l + 168l * 65536l + 0l * 256l + 1l;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 2014-05-02
        • 1970-01-01
        • 2011-06-07
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多