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

为什么把byte转成int的时候不与一下0xff就会出错呢?

public class HelloWorld {
    public byte[] int2Byte(int n){
        byte[] arr=new byte[4];
        for(int i=0;i<4;++i){
            arr[i]=(byte)((n>>i*8)&0x00ff);
        }
        return arr;
    }
    public int byte2Int(byte[] arr){
        int n=0;
        for(int  i=0;i<4;++i){
            //n+=(int)((arr[i]&0xff)<<i*8);
            n+=(int)(arr[i]<<i*8);//这样写的话结果会出错
        }
        return n;
    }
    public static void main(String[] args) {
        HelloWorld h=new HelloWorld();
        byte[] a=h.int2Byte(8143);
        for(int i=0;i<4;++i){
            System.out.println(Integer.toBinaryString(a[i]));
        }
        System.out.println(h.byte2Int(a));
    }
}

正在回答

2 回答

还在吗?还在我就回答。

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

peterme 提问者

在啊。
2016-11-02 回复 有任何疑惑可以回复我~

byte是1字节8 位,也就是最大255(11111111),但是Java会认为最高位代表的是符号位,所以byte识别的最大数位(x1111111)也就是127,一旦超过这个数,比如128(10000000),java 就会以补码形式存储,也就是128存为(11111111),1代表-则128存为-127,所以:将 byte 数组中的值与 0xFF 按位与(&),过程中 byte 会隐式类型转换为 int,当与 0xFF 按位与的时候,会将除了低 8 位的其他位全部置 0,这样将符号扩展的那些高位清除掉就可以了.



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

peterme 提问者

就是说移位结束后,会将结果先转为byte类型,然后再强转成int?
2016-11-02 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

为什么把byte转成int的时候不与一下0xff就会出错呢?

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