为什么我不能打印最大 long 值?
Why can't I print the maximum long value?
我正在编译一个 Java 程序,使用 for 循环找出 long 的最大值。但是,当我 运行 程序时,什么也没有打印出来。为什么?
这是我的代码:
class LongMaxMin {
public static void main(String args[]) {
long i = 0L;
long result = 0L;
for (; ; ) {
result = i++;
if (i<0)
break;
}
System.out.println("The biggest integer:" + result);
}
主要是时间原因。
A long
的 max 约为 ~9.22 quintillion。您从零开始并逐渐增加。这意味着您需要经过 9 个 quintillion 循环才能结束和中断。我刚刚尝试在我的 javascript 控制台中进行 运行 20 亿次操作,并在强制退出前超时几分钟。
如果你坐在那里让它 运行 足够长的时间,你就会得到你的输出。或者,从已经接近最大值的值开始 i
,例如 9,223,372,036,854,700,000,看看它是否仍然会给您同样的问题。在Java8中,允许adding underscore to numeric literals。将 i
初始化为 9_223_372_036_854_700_000L
会更及时地为您提供一些东西。
最大多头非常高,达到 9.223372e+18
。 For specifics, 9,223,372,036,854,775,807
是有问题的数字。这也有助于整个 "this works, it'll just take WAY too long" 理论。
我认为你的逻辑是正确的,只是要花很多时间才能达到那个值。
最大Long值可以容纳Long.MAX_value也就是9223372036854775807L
为了加速逻辑,我修改了程序如下,得到了预期的结果。
public static void main(String args[]) {
long i = 9223372036854775806L;
long result = 0L;
for (; ; ) {
result = i++;
if (i<0) {
System.out.println("result"+result);
System.out.println("i"+i);
break;
}
}
System.out.println("The biggest integer: is" + result);
}
输出:
结果9223372036854775807
i-9223372036854775808
最大整数:is9223372036854775807
result 有最大值,然后变为最小值。
我很好奇需要多长时间,所以我写了一个 class 来做同样的事情。用单独的线程编写,每 1 秒将结果更新到控制台。
"int" 结果
1,343,211,433 37.4518434691484288634492200 % left
Max Value: 2,147,483,647
Time Taken (seconds): **1.588**
"long" 结果
1,220,167,357 99.9999999867709190074470400 % left
2,519,937,368 99.9999999726787843108699600 % left
3,881,970,343 99.9999999579115932059510100 % left
5,210,983,861 99.9999999435023997711689800 % left
6,562,562,290 99.9999999288485570811055300 % left
7,853,387,353 99.9999999148534037050721500 % left
9,137,607,100 99.9999999009298653086103000 % left
10,467,975,104 99.9999998865059865071902600 % left
11,813,910,300 99.9999998719133278719112300 % left
13,183,196,499 99.9999998570674971548090400 % left
...it continues on and on...
1,362,032,97 - 第二个和第三个值之间的差异(1 秒)
6,771,768,529 秒 - 达到 long 的最大值需要多少秒 (Long.MAX_VALUE / 2nd3rdDifference)
6,771,768,529 秒 = 214.73 年(通过 google 搜索进行的每次转化)
因此,如果我的计算是正确的......当普通计算机通过递增并检查它是否溢出来计算 long 的最大值时,你就已经老了。你的 children 会死的。你的爷爷children,完成后他们可能就在身边...
最大值计算代码
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
public class MainLongMaxTest {
// /*
public static final long MAX_VALUE = Long.MAX_VALUE;
public static long value = 0;
public static long previousValue = 0;
// */
/*
public static final int MAX_VALUE = Integer.MAX_VALUE;
public static int value = 0;
public static int previousValue = 0;
*/
public static boolean done;
public static BigDecimal startTime;
public static BigDecimal endTime;
public static void main(String[] args) {
Runnable task = new StatusPrinterRunnable();
new Thread(task).start(); // code waits 1 second before result printing loop
done = false;
startTime = new BigDecimal(System.currentTimeMillis());
while(value >= 0) {
previousValue = value;
value += 1;
}
endTime = new BigDecimal(System.currentTimeMillis());
done = true;
}
}
class StatusPrinterRunnable implements Runnable {
public static final NumberFormat numberFormat = NumberFormat.getNumberInstance();
private static long SLEEP_TIME = 1000;
@Override
public void run() {
try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { throw new RuntimeException(e); }
while(!MainLongMaxTest.done) {
long value = MainLongMaxTest.value;
//long valuesLeft = MAX_VALUE - value;
BigDecimal maxValueBd = new BigDecimal(MainLongMaxTest.MAX_VALUE);
BigDecimal valueBd = new BigDecimal(value);
BigDecimal differenceBd = maxValueBd.subtract(valueBd);
BigDecimal percentLeftBd = differenceBd.divide(maxValueBd, 25, RoundingMode.HALF_DOWN);
percentLeftBd = percentLeftBd.multiply(new BigDecimal(100));
String numberAsString = numberFormat.format(value);
String percentLeftAsString = percentLeftBd.toString();
String message = "" + numberAsString + "\t" + percentLeftAsString + " % left";
System.out.println(message);
try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { throw new RuntimeException(e); }
}
BigDecimal msTaken = MainLongMaxTest.endTime.subtract(MainLongMaxTest.startTime);
BigDecimal secondsTaken = msTaken.divide(new BigDecimal("1000"));
System.out.println();
System.out.println("Max Value: " + numberFormat.format(MainLongMaxTest.previousValue));
System.out.println("Time Taken (seconds): " + secondsTaken);
}
}
如果你利用二元代数,你可以一步得到结果:
结果 = -1L >>> 1;
我正在编译一个 Java 程序,使用 for 循环找出 long 的最大值。但是,当我 运行 程序时,什么也没有打印出来。为什么?
这是我的代码:
class LongMaxMin {
public static void main(String args[]) {
long i = 0L;
long result = 0L;
for (; ; ) {
result = i++;
if (i<0)
break;
}
System.out.println("The biggest integer:" + result);
}
主要是时间原因。
A long
的 max 约为 ~9.22 quintillion。您从零开始并逐渐增加。这意味着您需要经过 9 个 quintillion 循环才能结束和中断。我刚刚尝试在我的 javascript 控制台中进行 运行 20 亿次操作,并在强制退出前超时几分钟。
如果你坐在那里让它 运行 足够长的时间,你就会得到你的输出。或者,从已经接近最大值的值开始 i
,例如 9,223,372,036,854,700,000,看看它是否仍然会给您同样的问题。在Java8中,允许adding underscore to numeric literals。将 i
初始化为 9_223_372_036_854_700_000L
会更及时地为您提供一些东西。
最大多头非常高,达到 9.223372e+18
。 For specifics, 9,223,372,036,854,775,807
是有问题的数字。这也有助于整个 "this works, it'll just take WAY too long" 理论。
我认为你的逻辑是正确的,只是要花很多时间才能达到那个值。
最大Long值可以容纳Long.MAX_value也就是9223372036854775807L
为了加速逻辑,我修改了程序如下,得到了预期的结果。
public static void main(String args[]) {
long i = 9223372036854775806L;
long result = 0L;
for (; ; ) {
result = i++;
if (i<0) {
System.out.println("result"+result);
System.out.println("i"+i);
break;
}
}
System.out.println("The biggest integer: is" + result);
}
输出:
结果9223372036854775807 i-9223372036854775808 最大整数:is9223372036854775807
result 有最大值,然后变为最小值。
我很好奇需要多长时间,所以我写了一个 class 来做同样的事情。用单独的线程编写,每 1 秒将结果更新到控制台。
"int" 结果
1,343,211,433 37.4518434691484288634492200 % left
Max Value: 2,147,483,647
Time Taken (seconds): **1.588**
"long" 结果
1,220,167,357 99.9999999867709190074470400 % left
2,519,937,368 99.9999999726787843108699600 % left
3,881,970,343 99.9999999579115932059510100 % left
5,210,983,861 99.9999999435023997711689800 % left
6,562,562,290 99.9999999288485570811055300 % left
7,853,387,353 99.9999999148534037050721500 % left
9,137,607,100 99.9999999009298653086103000 % left
10,467,975,104 99.9999998865059865071902600 % left
11,813,910,300 99.9999998719133278719112300 % left
13,183,196,499 99.9999998570674971548090400 % left
...it continues on and on...
1,362,032,97 - 第二个和第三个值之间的差异(1 秒)
6,771,768,529 秒 - 达到 long 的最大值需要多少秒 (Long.MAX_VALUE / 2nd3rdDifference)
6,771,768,529 秒 = 214.73 年(通过 google 搜索进行的每次转化)
因此,如果我的计算是正确的......当普通计算机通过递增并检查它是否溢出来计算 long 的最大值时,你就已经老了。你的 children 会死的。你的爷爷children,完成后他们可能就在身边...
最大值计算代码
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
public class MainLongMaxTest {
// /*
public static final long MAX_VALUE = Long.MAX_VALUE;
public static long value = 0;
public static long previousValue = 0;
// */
/*
public static final int MAX_VALUE = Integer.MAX_VALUE;
public static int value = 0;
public static int previousValue = 0;
*/
public static boolean done;
public static BigDecimal startTime;
public static BigDecimal endTime;
public static void main(String[] args) {
Runnable task = new StatusPrinterRunnable();
new Thread(task).start(); // code waits 1 second before result printing loop
done = false;
startTime = new BigDecimal(System.currentTimeMillis());
while(value >= 0) {
previousValue = value;
value += 1;
}
endTime = new BigDecimal(System.currentTimeMillis());
done = true;
}
}
class StatusPrinterRunnable implements Runnable {
public static final NumberFormat numberFormat = NumberFormat.getNumberInstance();
private static long SLEEP_TIME = 1000;
@Override
public void run() {
try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { throw new RuntimeException(e); }
while(!MainLongMaxTest.done) {
long value = MainLongMaxTest.value;
//long valuesLeft = MAX_VALUE - value;
BigDecimal maxValueBd = new BigDecimal(MainLongMaxTest.MAX_VALUE);
BigDecimal valueBd = new BigDecimal(value);
BigDecimal differenceBd = maxValueBd.subtract(valueBd);
BigDecimal percentLeftBd = differenceBd.divide(maxValueBd, 25, RoundingMode.HALF_DOWN);
percentLeftBd = percentLeftBd.multiply(new BigDecimal(100));
String numberAsString = numberFormat.format(value);
String percentLeftAsString = percentLeftBd.toString();
String message = "" + numberAsString + "\t" + percentLeftAsString + " % left";
System.out.println(message);
try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { throw new RuntimeException(e); }
}
BigDecimal msTaken = MainLongMaxTest.endTime.subtract(MainLongMaxTest.startTime);
BigDecimal secondsTaken = msTaken.divide(new BigDecimal("1000"));
System.out.println();
System.out.println("Max Value: " + numberFormat.format(MainLongMaxTest.previousValue));
System.out.println("Time Taken (seconds): " + secondsTaken);
}
}
如果你利用二元代数,你可以一步得到结果:
结果 = -1L >>> 1;