在讀取16進(jìn)制數(shù) 0x7fffffff時(shí),buf[i]的值為-1,為什么
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){????????????????????//此處?如果沒(méi)有進(jìn)行與運(yùn)算,直接打印buf[i]結(jié)果為-1 ????????System.out.print("0"); ????} ????System.out.print(Integer.toHexString(buf[i]?&?0xff)+"?"); ????if(j++?%?10?==?0){ ????????System.out.println(); ????} }
文件的內(nèi)容為 A B?0x7fffffff?
2018-07-18
問(wèn)題和代碼無(wú)關(guān),你只要輸出System.out.println(0xffffffff)就會(huì)得到-1;原因是int 是有符號(hào)位,占4個(gè)字節(jié),而0xffffffff是以int類型存儲(chǔ)的,int是有符號(hào)的。即1111 1111 1111.......第一位被用來(lái)記錄符號(hào),所以這里就被解釋為負(fù)號(hào)了,而Java在編碼時(shí),存儲(chǔ)的是負(fù)數(shù)的補(bǔ)碼,所以你的1111.....就成了1000......+1就是10000.....1就是-1啦。
所以16進(jìn)制最大的數(shù)是0x7fffffff.