本帖最后由 第一印象 于 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就行了吗?
|