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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 中关村阿旺 中级黑马   /  2013-8-17 15:48  /  1550 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 中关村阿旺 于 2013-8-17 16:31 编辑

遇到一个问题:
byte b=1;
b=++b;
输出b的值:2
但是:
byte b=127;
b=++b;
输出b的值:-128
为什么没有超出byte的取值范围?
而是输出-128呢?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1 继续努力

查看全部评分

6 个回复

倒序浏览
byte的取值范围-128到127,你把++b赋值给b就是128,也就超出了取值范围,所以会输出-128.如果你+2就是129,输出就是-127。

评分

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

查看全部评分

回复 使用道具 举报
首先楼主爱思考是很好的 呵呵
我理解如下,首先byte 是占一个字节 八位,所以byte的取值范围 为-128 到127 用二级制表示是10000000到01111111
b=++b;这句代码,编译能通过是因为b=(byte)b+1;首先b+1,一个byte类型的跟int类型的会类型自动提升,所以结果为int型的128 用二进制表示就是10000000,然后再强制转换成byte类型,只留最后八位,所以就变成了10000000(前面的0全部去除了),100000000在byte类型里面是表示-128,所以楼主得到的结果是-128

评分

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

查看全部评分

回复 使用道具 举报
因为在JAVA语言中,byte类型为8位,最高表示127
在b=++b;以后b等于b再加上1, 但127的二进制表示为01111111,再加一溢出了。
就变成10000000,这就是-128了。所以b的表示值为-128。

评分

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

查看全部评分

回复 使用道具 举报
byte占用一个字节,八位,取值范围是-128到127。
  1. byte  b = 127;
  2. b = ++b;b会先自增在赋值,所以超出了byte的范围
复制代码
byte占八位,最高位用来表示正负,0表示正,1表示负。b=127的二进制表示是0111 1111,然后加以后二进制表示为1000 0000。二进制1000 0000就表示十进制的-128。因为负数的二进制等于该数绝对值的二进制反码加一。

评分

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

查看全部评分

回复 使用道具 举报
加分加分
回复 使用道具 举报
哇哈,都是高手啊……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马