这个问题在这里已有答案:
假设我有一个正的int x;我想加倍x直到它大于Integer.MAX_VALUE然后停止。
我知道MAX_VALUE = 2 ^ 31-1,如果x超出此值,则发生溢出,x变为负值。
我想知道我是否可以使用条件(x <0)检查x是否超出MAX_VALUE,因为x是一个整数,它永远不会超过MAX_VALUE所以我不能使用(x> Integer.MAX_VALUE)去检查。
使用long
代替:
int i = Integer.MAX_VALUE;
long l = (long) i * 2; //cast int to long
System.out.println(l); //prints 4294967294
是的,它总是有效,因为最后一次加倍的最大可能结果是(-2 ^ 31 +(2 ^ 31 - 1)),即-1。但是,它依赖于溢出/下溢是不受欢迎的,因为它是内存工作方式的副作用,而不是预期的效果。
而是使用像这样的BigInteger
:BigInteger i = new BigInteger("Enter number in base 10 here");
,然后你甚至不必担心Integer.MAX_VALUE
的价值,因为BigIntegers几乎是无限的。
如果加倍,任何大于最大值一半的(正)数将溢出,而将任何小于或等于最大值一半的数加倍将导致小于或等于最大值。所以这应该工作:
int sum = startValue;
int halfMax = Integer.MAX_VALUE / 2;
while ( sum <= halfMax ) {
sum *= 2;
}
循环从给定的数字开始,如果它<=最大值的一半,则总和加倍,一旦总和大于最大值的一半,就退出循环。