在读取16进制数 0x7fffffff时,buf[i]的值为-1,为什么

来源:4-2 字节流之文件输入流FileInputStream-2

恒10769

2018-07-17 11:51

byte[] buf = new byte[8 * 1024];
int bytes = in.read(buf,0,buf.length);
int j=1;
for (int i = 0; i < bytes; i++){
    if ((buf[i] & 0xff) <= 0xf){                    //此处 如果没有进行与运算,直接打印buf[i]结果为-1
        System.out.print("0");
    }
    System.out.print(Integer.toHexString(buf[i] & 0xff)+" ");
    if(j++ % 10 == 0){
        System.out.println();
    }
}

文件的内容为 A B 0x7fffffff 

写回答 关注

1回答

  • qq_星河k_0
    2018-07-18 19:14:56
    已采纳

    问题和代码无关,你只要输出System.out.println(0xffffffff)就会得到-1;原因是int 是有符号位,占4个字节,而0xffffffff是以int类型存储的,int是有符号的。即1111 1111 1111.......第一位被用来记录符号,所以这里就被解释为负号了,而Java在编码时,存储的是负数的补码,所以你的1111.....就成了1000......+1就是10000.....1就是-1啦。

    所以16进制最大的数是0x7fffffff.

    恒10769

    懂了,感谢

    2018-07-19 13:56:40

    共 1 条回复 >

文件传输基础——Java IO流

为您介绍IO流的使用,以及对象的序列化和反序列化的内容

133754 学习 · 1030 问题

查看课程

相似问题