当前位置:编程学习 > JAVA >>

求助,这个为啥会输出-10

public class c {

/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 0;;i++){
if(i==-10) System.out.println(i);
if(i==10) System.out.println(i);
if(i==1000*1000*5) System.out.println(i);
if(i==-1) break;

}
}

} --------------------编程问答-------------------- 0x7FFFFFF + 1 = 0x80000000 这个是-2的31次方,再增加会输出-10 --------------------编程问答-------------------- 和补码什么的有关吧。java的int型4个字节,32位,最高位为符号位。存储整数是以补码的形式存的,正数的补码就是本身,负数的补码是反码+1。
i从0开始,加啊加的,就变成01111...1(2进制),这时候再+1,就溢出,变成10000000 ...00,这个是一个负数的补码,而且负了很多(好想是-2147483648的补码)。。。然后慢慢加1,终于上升到-10的补码,最后再上升变成-1,退出循环了。 --------------------编程问答-------------------- 结果是
10
5000000
-10
 这个是因为for循环没有 进入条件判断,直接就进入了
而到了里面之后呢
初始值为0 每个都不相等
执行迭代部分,也就是i++
之后再直接进入
如此循环,每次加1
到了第11轮的时候,i=10了 就会执行后面那条语句,输出10
之后再进入i++ 比较的过程,
等i=1000*1000*5的时候,再输出后面语句,输出5000000
之后呢又是i++ 进入比较每个if的过程
等到到了int类型的最大值得时候,大概20多亿,具体多少忘了,再加的话就会变成一个非常小的负数,
然后负数每次加一,执行20多亿次,
就等于-10 了,输出后面的语句,也就是-10
然后 再i++ 比较 
9次之后,等于-1 执行后面的语句break;
跳出for循环

大体就是这个样子了,这只是一个过程,也许有的地方你不懂,但我相信随着你的继续学习,一定会自己理解的,写的不好的地方呢,也请谅解 --------------------编程问答-------------------- 前面两个数字很快就输出了,-10的话确还要等一会,就是在执行后面的那个过程的时候次数非常多,所以比较费时间!!! --------------------编程问答-------------------- #3正解.... --------------------编程问答-------------------- 溢出了,

Int  是32位,正数最高到  2147483647

当循环到达 2147483647继续累积,符号位由0变1 (溢出) 变为负数。
 当累加到 -10的时候 输出。
--------------------编程问答-------------------- 除
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,