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