为了账号安全,请及时绑定邮箱和手机立即绑定

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;

 }

正在回答

5 回答

首先,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,于是结果就是我们想要的了~

3 回复 有任何疑惑可以回复我~
#1

逗逗船长 提问者

非常感谢!
2015-07-16 回复 有任何疑惑可以回复我~
#2

_Jack_Han_

一个f表示4位吗?
2015-11-07 回复 有任何疑惑可以回复我~

-1的二进制位就是11111111111111111111111111111111 为何不对?

0 回复 有任何疑惑可以回复我~

aByte[i] << i*8   这句没有人讨论呢?感觉这个不需要移位吧

0 回复 有任何疑惑可以回复我~

32个1的二进制就是int类型的-1啊,虽然不是byte类型的-1,但值却是一致的。

&0xff的意思就是取8位,而8位正好是byte类型java长度。

0 回复 有任何疑惑可以回复我~
#1

_Jack_Han_

一个f代表4位吗?
2015-11-07 回复 有任何疑惑可以回复我~
#2

_神人A 回复 _Jack_Han_

16进制 就是等于4个位数的二进制啦
2015-12-15 回复 有任何疑惑可以回复我~

我也想知道为什么……

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
二进制基础
  • 参与学习       99871    人
  • 解答问题       210    个

二进制是计算机唯一能识别的语言,是学习计算机技术必备的知识

进入课程

byte转int的时候为什么非要先&0xff计算出来才是正确答案?明明byte数组里面每个元素都只保存了一个字节的内容,取不取指定位都应该一样才对啊

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信