黑马程序员技术交流社区

标题: for中死循环的例子,求解释 [打印本页]

作者: hjfeng1987    时间: 2014-7-18 10:55
标题: for中死循环的例子,求解释
本帖最后由 hjfeng1987 于 2014-7-24 22:36 编辑

bye的范围是-128到127.
//这里正常输出0到126
for(byte i = 0;i<127;i++){
            System.out.println(i);
}

//这里为什么会死循环,也不报错
  for(byte i = 0;i<128;i++){
            System.out.println(i);
}


作者: 李新    时间: 2014-7-18 11:10
你好,因为当i等于127时可以继续打印,当i加1时变成了-128,比128小,便开始继续循环。所以也不会报错。
嗯,应该是这样的。
作者: 爨庚轩    时间: 2014-7-18 11:29
for(byte i = 0;i<128;i++){
            System.out.println(i);
}
因为i的类型是byte,注定他不会超过127,当i=127时,i++为-128,你把127换成二进制算一下,这涉及到补码反码,
作者: 人心如水    时间: 2014-7-18 11:45
死循环0——127—— -128——0 当i=127时他会继续执行i++,127是最大正数,计算机中按补码进行计算,127表示0111 1111再加1就为1000 0000 ,计算1000 0000的源码就是减1取反0111 1111再取反1000 0000 =-128
即B1000 0000=D128了,再执行判断语句。
作者: 李云贵    时间: 2014-7-18 17:03
bye的范围是-128到127
计算机中按补码进行计算,127表示0111 1111再加1就为1000 0000 ,计算1000 0000的原码就是减1取反0111 1111再取反1000 0000 =-128

作者: 烟海    时间: 2014-7-18 17:22
本帖最后由 烟海 于 2014-7-18 17:24 编辑

楼上给的都非常详细了。。
byte的范围是-128-127 ,
这儿循环语句。for 执行到127之后,会先执行i++,然后再进行i<128的判断,而执行到127的i++的时候,已经超过了byte的范围,本应该是128 ,但是byte只占用一个字节,他的的范围只是-128~127,1个字节里面有8个bit位,8个bit位能过容纳的最大数为127 ,bit位的最高位为符号位,128的二进制为1000 0000,这儿在byte中,首位的1,代表的是符号,不代表数字的,所以当byte到128的时候,如果强制字符转换为byte的话,应该会丢失精度,貌似会变成-12 ,然后i在执行到127+1的时候,会变成-128,然后继续进行下一次循环,下一次到127+1的时候,会继续丢失精度,变成-128 ,所以会陷入死循环。
for(byte i = 0;i<128;i++){
            System.out.println(i);
}
作者: 烟海    时间: 2014-7-18 17:26
还有:不报错的原因是这儿是i++ .
如果是i=i+1,应该就会报错了,
作者: 单线程xia    时间: 2014-7-18 17:29
楼上各位说的很仔细了
作者: 烟海    时间: 2014-7-18 17:34
还有:不报错的原因是这儿是i++ .
如果是i=i+1,应该就会报错了,
刚刚对这个进行测试了,猜想是正确的,这儿i=i+1就会报错,提示丢失精度。

在i=i+1的时候,这个1,会默认为int类型,byte类型加上int类型,要赋值给int类型才行,而这儿的i为byte类型,所以赋值会丢失精度,会报错。

而i++ ,在运算过程中,会直接判断当前i数值以及+1以后的数字是否在byte范围内,如果在,则不会报错。。所以在你那个for循环中,虽然看着好像是127++了,但是并不会报错,不过一样的,丢失了精度,变成了-128 ,变成-128之后,还在byte范围内,所以无论如何,都不会报错。。。这个回复,是回答你,为何不会报错的。


//这里为什么会死循环,也不报错
  for(byte i = 0;i<128;i++){
            System.out.println(i);
}
作者: 郑飞    时间: 2014-7-18 18:03
学习了...
作者: Imp_x    时间: 2014-7-18 23:35
烟海 发表于 2014-7-18 17:34
还有:不报错的原因是这儿是i++ .
如果是i=i+1,应该就会报错了,
刚刚对这个进行测试了,猜想是正确的,这 ...

i=(byte)(i+1)  为何也是死循环
作者: icris    时间: 2014-7-18 23:38
Imp_x 发表于 2014-7-18 23:35
i=(byte)(i+1)  为何也是死循环

i+1 是 byte + int ,返回 int ,int 不能转 byte ,应该用i=i+(byte)1

作者: xwh1230    时间: 2014-7-18 23:39
因为byte的取值范围是-128-127之间,所以你的i<128这个条件不用判断都是真的,所以进入死循环,也就是说i<128等价于true;另外死循环不会报错。。。
作者: hjfeng1987    时间: 2014-7-18 23:51
烟海 发表于 2014-7-18 17:22
楼上给的都非常详细了。。
byte的范围是-128-127 ,
这儿循环语句。for 执行到127之后,会先执行i++,然后再 ...

大概理解了,就是补码反码那部分要学习下
作者: Imp_x    时间: 2014-7-19 00:01
icris 发表于 2014-7-18 23:38
i+1 是 byte + int ,返回 int ,int 不能转 byte ,应该用i=i+(byte)1

i=i+(byte)1 你这样子还是直接报错 丢失精度:L
作者: 郭良    时间: 2014-7-19 00:05
讲的都很详细啊
作者: wisely    时间: 2014-7-19 00:06
Imp_x 发表于 2014-7-18 23:35
i=(byte)(i+1)  为何也是死循环

i+1为int型,(byte)(i+i)后强转为byte型,i是byte型,取值范围为-128~127,i<128,必然的死循环。
作者: icris    时间: 2014-7-19 00:10
Imp_x 发表于 2014-7-19 00:01
i=i+(byte)1 你这样子还是直接报错 丢失精度

大意了…+ 运算直接会提升到 int ,转 byte 不起作用,结果是 int 的 i 和 int 的 1 相加得到 int ,直接赋给 byte 是会报错…

作者: Imp_x    时间: 2014-7-19 00:12
icris 发表于 2014-7-19 00:10
大意了…+ 运算直接会提升到 int ,转 byte 不起作用,结果是 int 的 i 和 int 的 1 相加得到 int ,直接 ...

看视频脑袋都糊涂了= =刚自己强转类型byte  果断继续死循环~-~
作者: 357016138    时间: 2014-7-19 00:52
都是高手啊‘111
作者: 编程学徙    时间: 2014-7-19 04:39
有没有人能详尽解释一下byte数据是如何在内存中表示的?几个字节?几位?都怎么循环来着?
作者: mytongyong    时间: 2014-7-19 06:32
讲的都很详细了,基本没有什么要补充的了。呵呵
作者: 郑阳阳    时间: 2014-7-19 08:40
学习了 以前还真没想这个问题
作者: a191170796    时间: 2014-7-19 09:07
学习一下!!!!
作者: IT初学者    时间: 2014-7-19 11:43
学习了。。。。。
作者: 月影箫风起k    时间: 2014-7-20 19:52
看来偶尔转转论坛根本抢不到前几楼啊,只有前几楼才有可能加分。。。无语,看来只能学完之后每天守着论坛了抢前几楼来回答了。。。
作者: 伊甸拾忆    时间: 2014-7-20 21:52
学习下原反补码
作者: doubandddk    时间: 2014-7-20 22:03
这个很热闹啊
作者: 马超(Andy)    时间: 2014-7-20 22:07
怎么说呢~  楼上正解   {:3_50:}
作者: F@C    时间: 2014-7-20 22:22
进来学习
作者: 烟海    时间: 2014-7-21 00:42
为什么没人给我加技术分,我觉得回答的也挺多的啊?
作者: M单色调    时间: 2014-7-21 07:15
嗯,应该是这样的!
作者: 烟海    时间: 2014-7-21 14:44
hjfeng1987 发表于 2014-7-18 23:51
大概理解了,就是补码反码那部分要学习下

嗯。。是的。。。
不过那个貌似听说不是很重要。。。。
不值得花太多的时间,但是稍微看一下还是有必要的。
作者: lijiang    时间: 2014-7-21 15:43
路过,学习一下
作者: 高老强    时间: 2014-7-21 15:52
小于128,不也是127?
作者: 青程    时间: 2014-7-21 21:45
引用游戏界的一个词,这叫:穿透
作者: 楚风★憧憬    时间: 2014-7-22 00:31
还有:不报错的原因是这儿是i++ .
如果是i=i+1,应该就会报错了,
刚刚对这个进行测试了,猜想是正确的,这儿i=i+1就会报错,提示丢失精度。

在i=i+1的时候,这个1,会默认为int类型,byte类型加上int类型,要赋值给int类型才行,而这儿的i为byte类型,所以赋值会丢失精度,会报错。

而i++ ,在运算过程中,会直接判断当前i数值以及+1以后的数字是否在byte范围内,如果在,则不会报错。。所以在你那个for循环中,虽然看着好像是127++了,但是并不会报错,不过一样的,丢失了精度,变成了-128 ,变成-128之后,还在byte范围内,所以无论如何,都不会报错。。。这个回复,是回答你,为何不会报错的。


//这里为什么会死循环,也不报错
  for(byte i = 0;i<128;i++){
            System.out.println(i);
作者: inception    时间: 2014-7-22 03:14
本帖最后由 inception 于 2014-7-22 03:18 编辑

算是懂了 ,学习了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2