循環中不加0xff 第一個循環出的結果是ffffffc4 ffffffbd ffffffbf ffffffce 41 42 43 ,不是老師講的前24位都是零,為什么?
循環中不加0xff 第一個循環出的結果是ffffffc4 ffffffbd ffffffbf ffffffce 41 42 43 ,不是老師講的前24位都是零,為什么?
循環中不加0xff 第一個循環出的結果是ffffffc4 ffffffbd ffffffbf ffffffce 41 42 43 ,不是老師講的前24位都是零,為什么?
2016-05-27
舉報
2016-05-29
首先老師講的有點小錯誤,不是去掉24個0,是去掉24個【0或1】.為什么呢? 我們以GBK編碼的‘慕’為例,如果直接輸出Integer.toHexString( b ),不進行&操作。結果是:ffffffc4 ?ffffffbd.可以看出&操作去掉的是6個f也就是24個1.不應該是24個0嗎?我們知道一個字節占8位,可以表示兩個16進制數,c4和bd的2進制表示分別為:1100 0100,1011 1101.可以看到他們的第一位都是1.而計算機是以補碼形式存儲數據。當計算機讀取c4時,發現第一位是1,所以c4表示的整數是負數,要得到該負數需要進行取反+1操作得到它表示的正數,然后添加符號位。1100 0100取反+1后是0011 1100,即十進制的60,所以c4表示的是-60。而-60作為一個整形在內存中是以ffffffc4存儲的。為了驗證這種想法,我們直接輸出b,也就是b的整數形式System.out.print( b + " ?" );結果是:-60 ?-67.什么時候&的作用是去掉0呢,沒錯,這個字節的二進制存儲中第一位是0,也就是說是個正數。比如'腣'這個字,它的Integer.toHexString( b )結果是ffffffc4 ?56,第二個字節56在內存中的二進制數是0101 0110,所以當讀取56這個十六進制數時,自然當做正數存儲,而正數的補碼是其本身!
2016-08-25
加入0xff是吧當前數組&0000-0000?0000-0000?0000-0000 1111-1111.這樣取到的是最低八位,既是有效數字
2016-07-21
ff代表8個1,跟32位的字符相與之后不論前24位是0還是1,都會只剩后8位
2016-05-27
這是16進制顯示方式 ?你試下
System.out.print(Integer.toBinaryString(變量));