A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hjfeng1987 中级黑马   /  2014-7-18 10:55  /  8576 人查看  /  39 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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);
}

评分

参与人数 1技术分 +1 收起 理由
Doraemon + 1

查看全部评分

39 个回复

倒序浏览
你好,因为当i等于127时可以继续打印,当i加1时变成了-128,比128小,便开始继续循环。所以也不会报错。
嗯,应该是这样的。
回复 使用道具 举报
for(byte i = 0;i<128;i++){
            System.out.println(i);
}
因为i的类型是byte,注定他不会超过127,当i=127时,i++为-128,你把127换成二进制算一下,这涉及到补码反码,

评分

参与人数 1技术分 +1 收起 理由
Doraemon + 1

查看全部评分

回复 使用道具 举报
死循环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了,再执行判断语句。
回复 使用道具 举报
bye的范围是-128到127
计算机中按补码进行计算,127表示0111 1111再加1就为1000 0000 ,计算1000 0000的原码就是减1取反0111 1111再取反1000 0000 =-128
回复 使用道具 举报
本帖最后由 烟海 于 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:13
7#
还有:不报错的原因是这儿是i++ .
如果是i=i+1,应该就会报错了,
回复 使用道具 举报
楼上各位说的很仔细了
回复 使用道具 举报
烟海 中级黑马 2014-7-18 17:34:29
9#
还有:不报错的原因是这儿是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-19 21:31
回复 使用道具 举报
学习了...
回复 使用道具 举报
Imp_x 高级黑马 2014-7-18 23:35:47
11#
烟海 发表于 2014-7-18 17:34
还有:不报错的原因是这儿是i++ .
如果是i=i+1,应该就会报错了,
刚刚对这个进行测试了,猜想是正确的,这 ...

i=(byte)(i+1)  为何也是死循环

点评

楼下已经给你回复过了。。。条件i<128 ,而byte的范围就在条件内,所以for的条件永远为true ,所有死循环。。  发表于 2014-7-21 14:43
回复 使用道具 举报
icris 中级黑马 2014-7-18 23:38:34
12#
Imp_x 发表于 2014-7-18 23:35
i=(byte)(i+1)  为何也是死循环

i+1 是 byte + int ,返回 int ,int 不能转 byte ,应该用i=i+(byte)1
回复 使用道具 举报
因为byte的取值范围是-128-127之间,所以你的i<128这个条件不用判断都是真的,所以进入死循环,也就是说i<128等价于true;另外死循环不会报错。。。
回复 使用道具 举报
烟海 发表于 2014-7-18 17:22
楼上给的都非常详细了。。
byte的范围是-128-127 ,
这儿循环语句。for 执行到127之后,会先执行i++,然后再 ...

大概理解了,就是补码反码那部分要学习下
回复 使用道具 举报
Imp_x 高级黑马 2014-7-19 00:01:04
15#
icris 发表于 2014-7-18 23:38
i+1 是 byte + int ,返回 int ,int 不能转 byte ,应该用i=i+(byte)1

i=i+(byte)1 你这样子还是直接报错 丢失精度:L
回复 使用道具 举报
讲的都很详细啊
回复 使用道具 举报
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:03
18#
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:52
19#
icris 发表于 2014-7-19 00:10
大意了…+ 运算直接会提升到 int ,转 byte 不起作用,结果是 int 的 i 和 int 的 1 相加得到 int ,直接 ...

看视频脑袋都糊涂了= =刚自己强转类型byte  果断继续死循环~-~
回复 使用道具 举报
都是高手啊‘111
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马