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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 lucy198921 于 2013-3-21 21:23 编辑

以下这个Demo的运算结果为什么是44?


class Demo  {
        int y = 3;
        public static void main(String[] args) {
        
                int x = 173;
                byte b = 127;
                x = x + b;
                b = (byte)(b + x);   // 明明byte型会自动提升为int型运算,运算结果x=300我可以理解,但是为什么b=44?
                System.out.println(b);
                     System.out.println(x);
        }
}


还请各位高手指教.谢谢

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

8 个回复

倒序浏览
byte类型的范围应该是-128-127,超范围截断了吧

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
何红卫 发表于 2013-3-20 23:30
byte类型的范围应该是-128-127,超范围截断了吧

求详解,上图表示的话更好.  
回复 使用道具 举报
byte类型的取值范围是-128到127,如果运算得到的值不在这个范围内,会从头开始,不会超过这个范围。b+x=127+300=427的溢出了。强转的,然后会从头计算。300-128-128=44.就是-128到127之间是两个128的数。300属于溢出的部分,因为强转成byte类型,所以它一直减去128,值到得到的值在-128到127范围内就行。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
b不是44吧。肯定是负数
回复 使用道具 举报
等于-85哦!!!
因为Byte取值范围为 127~  -128

127+300=427  溢出了  427-256 =171  171-256=-85

-85在byte的值范围

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
不会吧,我运算的结果b=-85啊!b = (byte)(b + x);  这一步中,b自动转换成int型进行运算,运算结果为427(int型),强制转换成byte类型时 ,保留int类型的低八位,其他的三个字节舍去,byte中第一位为符号位为1表示负数(表示-128),后面的部分为43,则其结果为-85!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 江公亮 于 2013-3-21 10:39 编辑

b=byte(b+x),括号里面的是427,而427的二进制是 110101011,byte转型后,只取低八位,也就是10101011=-85,
所以b就是-85了,不应该是44吧,。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
记得及时处理帖子哦,继续追问,或将分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马