假设我有一个正整数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)进行检查。
答案 0 :(得分:0)
改为使用long
:
int i = Integer.MAX_VALUE;
long l = (long) i * 2; //cast int to long
System.out.println(l); //prints 4294967294
答案 1 :(得分:0)
是的,它将始终有效,因为最后加倍的最大可能结果是(-2 ^ 31 +(2 ^ 31-1)),即-1。但是,依赖于上溢/下溢是不受欢迎的,因为它是内存工作方式的副作用,而不是预期的效果。
答案 2 :(得分:0)
使用BigInteger
这样的BigInteger i = new BigInteger("Enter number in base 10 here");
来代替,然后您甚至不必担心Integer.MAX_VALUE
上的值会变大,因为BigIntegers几乎是无限的。
答案 3 :(得分:0)
大于两倍的任何(正)数如果加倍就会溢出,而小于或等于最大值的一半的任何数倍都会导致小于或等于最大值的值。所以这应该工作:
int sum = startValue;
int halfMax = Integer.MAX_VALUE / 2;
while ( sum <= halfMax ) {
sum *= 2;
}
循环从给定的数字开始,如果小于等于最大值的一半,则将总和加倍,并在总和大于最大值的一半时退出循环。
答案 4 :(得分:-1)
有一种简单的方法可以检查下一次添加是否会导致溢出。
假设我们使用变量 sum 来存储所有加法的总和。然后,为确保下一次迭代不会导致溢出,请确保 MAX_VALUE-sum> = sum * sum 。
下面是如何在Java中实现此示例:
private static int doubleValue(int value)
{
int sum = value;
while (Integer.MAX_VALUE - sum >= sum)
{
sum *= 2;
}
return sum;
}
此代码返回未溢出的 sum 的最后一个值。