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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 第一印象 于 2013-8-30 21:24 编辑

今天又做了一个有趣的实验,结果能解释的通,但结果不是我想要的结果,求解答:
1.byte b = 127;
2.byte c = (byte)(b<<1);
3.System.out.println(Integer.toBinaryString(c));  //猜猜结果?


分析如下:
1. byte b = 127,二进制为0111-111
2. byte c = (byte)(b<<1),先计算b<<1,计算前,b先会转换为int类型,也就是0111-1111转化为了0000-0000 0000-0000 0000-0000 0111-1111,
    左移1位后变成了0000-0000 0000-0000 0000-0000 1111-1110 , 这时候一个强转,转成byte类型:1111-1110,结果的二进制最高位为1,代表
    负数,所以要取反:0000-0001,再加1,0000-0010,成了负2了,到这一步是没问题的,也没有什么疑惑
3.问题来了,Integer.toBinarryString(c)的打印结果为:1111-1111 1111-1111 1111-1111 1111-1110,从这个结果可以看出来,应该是int类型的负2
  取反再加1的结果,也就是0000-0010转化为int类型:0000-0000 0000-0000 0000-0000 0000-0010,
  再取反:1111-1111 1111-1111 1111-1111 1111-1101,再加1:1111-1111 1111-1111 1111-1111 1111-1110,也就是Integer.toBinaryString(c)
  打印的结果,可是为啥呢?我看了下Integer.toBinaryString(c)方法,这个方法的参数是int类型的,也就是将c进行了装箱,
  难道byte类型转化为int类型也要取反加1吗?不是多出的位补0就行了吗?

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1 很给力!

查看全部评分

3 个回复

倒序浏览
从结果来看没有什么问题。首先是 (byte)(127<<1)结果是-2,二进制11111110
然后tobinstr(-2)结果是1111-1111 1111-1111 1111-1111 1111-1110
再比如。2的二进制是00000010
tobinstr(-2)结果是10,前面的0省略了,
可以发现规律,byte强转int是可以无损转换的,负数前面加1,正数前面加0

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 赞一个!

查看全部评分

回复 使用道具 举报
yxz 发表于 2013-8-30 14:03
从结果来看没有什么问题。首先是 (byte)(127

如果-2转换为二进制后成10了,我就没什么疑惑了,问题是转换后成了:11111111111111111111111111111110
回复 使用道具 举报
仔细想想呢,觉得也没什么问题了,byte类型的127左移动一位后成了254了,254用byte类型表示是-2,但是-2如果用int类型来表示,结果是4294967294,二进制是:11111111111111111111111111111110,这样解释的话也就解释的通了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马