Dea*_*Iss 96 java math variable-assignment
我有一个简单的程序:
public class Mathz {
static int i = 1;
public static void main(String[] args) {
while (true){
i = i + i;
System.out.println(i);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序,我看到的是0对i我的输出.我原本预计会有第一次i = 1 + 1,然后是i = 2 + 2,然后是i = 4 + 4等等.
这是因为我们一旦尝试i在左侧重新声明,它的值会重置为0?
如果有人能指出我更精细的细节,这将是伟大的.
更改int为long,似乎是按预期打印数字.我惊讶于它达到最大32位值的速度有多快!
Ali*_*ani 334
问题是整数溢出.如果它溢出,它会回到最小值并从那里继续.如果它下溢,它会回到最大值并从那里继续.下图是里程表.我用它来解释溢出.这是一个机械溢出,但仍然是一个很好的例子.
在里程表中,max digit = 9超出最大限度的手段9 + 1,它会带来并给出一个0; 但是没有更高的数字可以更改为a 1,因此计数器将重置为zero.你明白了 - 现在想到"整数溢出".

int类型的最大十进制文字是2147483647(2 31 -1).从0到2147483647的所有十进制文字都可能出现在int文字可能出现的任何地方,但文字2147483648可能只出现作为一元否定运算符的操作数 - .
如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的二进制补码格式所示.如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同.
因此,2147483647 + 1溢出和包裹到-2147483648.因此int i=2147483647 + 1会溢出,这不等于2147483648.另外,你说"它总是打印0".它没有,因为http://ideone.com/WHrQIW.下面,这8个数字表示它转动和溢出的点.然后它开始打印0.此外,不要惊讶它的计算速度有多快,今天的机器很快.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Run Code Online (Sandbox Code Playgroud)
Lou*_*man 168
问题是由于整数溢出.
在32位二进制补码算法中:
i确实开始具有两个幂的值,但是一旦你到达2 30,溢出行为就开始了:
2 30 + 2 30 = -2 31
-2 31 + -2 31 = 0
......在int算术中
pet*_*rov 46
不,它不会只打印零.
将其更改为此,您将看到会发生什么.
int k = 50;
while (true){
i = i + i;
System.out.println(i);
k--;
if (k<0) break;
}
Run Code Online (Sandbox Code Playgroud)
发生什么叫做溢出.
小智 15
static int i = 1;
public static void main(String[] args) throws InterruptedException {
while (true){
i = i + i;
System.out.println(i);
Thread.sleep(100);
}
}
Run Code Online (Sandbox Code Playgroud)
出局:
2
4
8
16
32
64
...
1073741824
-2147483648
0
0
when sum > Integer.MAX_INT then assign i = 0;
Run Code Online (Sandbox Code Playgroud)