黑马程序员技术交流社区

标题: 求解byte问题 [打印本页]

作者: 中关村阿旺    时间: 2013-8-17 15:48
标题: 求解byte问题
本帖最后由 中关村阿旺 于 2013-8-17 16:31 编辑

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

作者: yangxin540    时间: 2013-8-17 16:23
byte的取值范围-128到127,你把++b赋值给b就是128,也就超出了取值范围,所以会输出-128.如果你+2就是129,输出就是-127。
作者: a2213502    时间: 2013-8-17 16:25
首先楼主爱思考是很好的 呵呵
我理解如下,首先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
作者: SammaZhang    时间: 2013-8-17 16:33
因为在JAVA语言中,byte类型为8位,最高表示127
在b=++b;以后b等于b再加上1, 但127的二进制表示为01111111,再加一溢出了。
就变成10000000,这就是-128了。所以b的表示值为-128。

作者: 昝文萌    时间: 2013-8-17 16:48
byte占用一个字节,八位,取值范围是-128到127。
  1. byte  b = 127;
  2. b = ++b;b会先自增在赋值,所以超出了byte的范围
复制代码
byte占八位,最高位用来表示正负,0表示正,1表示负。b=127的二进制表示是0111 1111,然后加以后二进制表示为1000 0000。二进制1000 0000就表示十进制的-128。因为负数的二进制等于该数绝对值的二进制反码加一。
作者: EYE_SEE_YOU    时间: 2013-8-17 19:32
加分加分

作者: 中关村阿旺    时间: 2013-9-21 15:09
哇哈,都是高手啊……




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