有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

长数据类型中k的java正幂

我必须打印javalong数据类型中整数k的所有正幂。 我的代码是:

int k = Integer.parseInt(args[0]);
    int i = 1;
    long a = k;
    while (a <= Long.MAX_VALUE) {
        System.out.print(i + " ");
        System.out.println(a);
        i++;
        a = (long) Math.pow(k, i);
      }

当我运行这个程序时,会创建一个无限循环

但是,当我运行这个程序时,做了一个小改动:(我刚刚删除了while条件下的等于运算符)

int k = Integer.parseInt(args[0]);
    int i = 1;
    long a = k;
    while (a < Long.MAX_VALUE) {
        System.out.print(i + " ");
        System.out.println(a);
        i++;
        a = (long) Math.pow(k, i);
       }

在那次小小的改变之后,我认为它工作得很好。 但是,我无法理解这里发生了什么


共 (3) 个答案

  1. # 1 楼答案

    一片寂静地溢出。先计算迭代次数,然后循环该次数

  2. # 2 楼答案

    长数据类型是64位2的补码整数。如果检查这两种情况下的结果,您会发现在经过一定次数的迭代后,它会达到其最大值,随后的迭代会将计算结果限制为long的最大值。因此<;=条件永远不会为假,因为它将保持等于long max。 当您删除equals条件时,它将在接近long max的最近值后中断

    尝试将K设为2,确定迭代次数为63。(长度为64位)

  3. # 3 楼答案

    问题是在Math.pow()调用之后从doublelong的转换double可以容纳比long大得多的数字,如果您尝试将大的double强制转换为long,您将得到Long.MAX_VALUE。您的第一个循环将永远不会退出,因为在某个点之后的所有指数将只返回Long.MAX_VALUE

    你自己看看:

    public class DoubleToLong {
        public static void main(String[] args) {
            System.out.println((long)Double.MAX_VALUE);
            System.out.println(Long.MAX_VALUE);
        }
    }
    

    返回:

    9223372036854775807
    9223372036854775807