byte转int的时候为什么非要先&0xff计算出来才是正确答案?明明byte数组里面每个元素都只保存了一个字节的内容,取不取指定位都应该一样才对啊
public static int bytesToInt(byte[] aByte) { int bInt = 0; for(int i = 0;i < aByte.length;i++) { bInt += (int)(aByte[i] << i*8); //为什么这样就是错的结果? } return bInt; }
public static int bytesToInt(byte[] aByte) { int bInt = 0; for(int i = 0;i < aByte.length;i++) { bInt += (int)(aByte[i] << i*8); //为什么这样就是错的结果? } return bInt; }
2015-06-28
首先,java中的二进制采用的是补码形式,并非原码或反码,这3个概念要搞清楚;
其次,byte占8位,int占32位,将byte强制转换为int型时,如果没有做 & 0xff运算,且byte对应的值为负数的话,就会对高位3个字节进行补位,这样就有可能出现补位误差的错误。
举例来说,byte型的-1,其二进制(补码)为11111111(即0xff),转换成int型,值也应该为-1,但经过补位后,得到的二进制为11111111111111111111111111111111(即0xffffffff),这就不是-1了,对吧?
而0xff默认是int型,所以,一个byte跟0xff相与,会先将那个byte转化成int型运算,这样,结果中的高位3个字节就总会被清0,于是结果就是我们想要的了~
举报