首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java: 9223372036854775807L的长整型的<和<=的区别

Java: 9223372036854775807L的长整型的<和<=的区别
EN

Stack Overflow用户
提问于 2020-02-16 02:47:28
回答 2查看 198关注 0票数 1

当我在JVM中运行以下代码时,我无法理解它为什么会这样。根据我的理解,< x运算符应该转到x-1

代码语言:javascript
运行
复制
  public class LongQuestion {

  public static void main(String[] args) {

        if(9223372036854775807L < Math.pow(2,63)) {
            System.out.println("True");                            // DOES NOT GET PRINTED
        }

         if(9223372036854775807L <= Math.pow(2,63) - 1 ) {
            System.out.println("Also True");                       // THIS GETS PRINTED
        }

    }

}

我想知道为什么Java是这样的。

EN

回答 2

Stack Overflow用户

发布于 2020-02-16 02:52:16

Math.pow被声明为

代码语言:javascript
运行
复制
public static double pow​(double a, double b)

所以我们要处理的是替身。Math.pow(2,63)是"2.0d ^ 63.0d“(power,不是eor)。由于double总共为64位,因此更改低于最高有效位的60个奇数位的值不会改变该值。所以Math.pow(2,63) == Math.pow(2,63) - 1,也就是(double)9223372036854775807L

在第一个if中隐含地进行隐式强制转换。

代码语言:javascript
运行
复制
    if((double)9223372036854775807L < Math.pow(2.0d,63.0d)) {
        System.out.println("True");                            // DOES NOT GET PRINTED
    }

<的左边和右边都是9.223372036854776E18,所以是false

票数 2
EN

Stack Overflow用户

发布于 2020-02-16 02:56:12

以下代码将帮助您理解它:

代码语言:javascript
运行
复制
public class Main {
    public static void main(String[] args) {
        System.out.println("Long.MAX_VALUE is " + Long.MAX_VALUE);
        System.out.println("Math.pow(2, 63) is " + Math.pow(2, 63));
        System.out.println("Math.pow(2, 63) - 1 is " + (Math.pow(2, 63) - 1));
        System.out.println("(long)Math.pow(2, 63) is " + (long) Math.pow(2, 63));
        System.out.println("(long)(Math.pow(2, 63) - 1) is " + (long) (Math.pow(2, 63) - 1));

        if (9223372036854775807L < Math.pow(2, 63)) {
            System.out.println("9223372036854775807L < Math.pow(2, 63)");
        }

        if (9223372036854775807L <= Math.pow(2, 63)) {
            System.out.println("9223372036854775807L <= Math.pow(2, 63)");
        }

        if (9223372036854775807L <= Math.pow(2, 63) - 1) {
            System.out.println("9223372036854775807L <= Math.pow(2, 63) - 1");
        }

        if (9223372036854775807L < (long) Math.pow(2, 63)) {
            System.out.println("9223372036854775807L < (long)Math.pow(2, 63)");
        }

        if (9223372036854775807L <= (long) Math.pow(2, 63)) {
            System.out.println("9223372036854775807L <= (long)Math.pow(2, 63)");
        }

        if (9223372036854775807L <= (long) Math.pow(2, 63) - 1) {
            System.out.println("9223372036854775807L <= (long)Math.pow(2, 63) - 1");
        }

        if (9223372036854775807L <= (long) (Math.pow(2, 63) - 1)) {
            System.out.println("9223372036854775807L <= (long)(Math.pow(2, 63) - 1)");
        }
    }
}

输出:

代码语言:javascript
运行
复制
Long.MAX_VALUE is 9223372036854775807
Math.pow(2, 63) is 9.223372036854776E18
Math.pow(2, 63) - 1 is 9.223372036854776E18
(long)Math.pow(2, 63) is 9223372036854775807
(long)(Math.pow(2, 63) - 1) is 9223372036854775807
9223372036854775807L <= Math.pow(2, 63)
9223372036854775807L <= Math.pow(2, 63) - 1
9223372036854775807L <= (long)Math.pow(2, 63)
9223372036854775807L <= (long)(Math.pow(2, 63) - 1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60242023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档