接下來的結論只是真正事實的必要條件,我不能保證充分.我會持續驗證各個結論.
1.byte轉int截取的是低八位
public class Test{
public static void mian(String[] args){
int i = -1;
byte[] bytes = new byte[4];
bytes[0] = (byte)((i>>0*8)*0xff);
bytes[1] = (byte)((i>>1*8)*0xff);
bytes[2] = (byte)((i>>2*8)*0xff);
bytes[3] = (byte)((i>>3*8)*0xff);
for(byte b:bytes){
Sytem.out.print(b +", ");
}
}
}//輸出結果: -1, -1, -1, -1,
我們進行詳細分析:
①:先計算 -1在計算機中的補碼
...首先,因爲 int 類型是4的字節.想表示負數,高位一定是1.對於負數,實際儲存的是補碼.對 負數的絕對值 取反 再加上1,即爲 此負數的補碼.
...實際情況下,在任意一個類型中.只要計算機判定其最高位(int 類型就是從右向左的第32位,byte類型就是從左到右第8位)是1,則會自動進行 減1取反拿到絕對值,在屏幕上輸出負號接上絕對值.或者說,計算機從來不認識負值,它只有表示負值的辦法而已.
....這樣,得到 int類型的-1在系統的實際存儲情況如下:
....1111 1111 1111 1111 1111 1111 1111 1111
②:用bytes[3]來詳細講明情況
...右移三位(就是三個字節)
...0000 0000 0000 0000 0000 0000 1111 1111
...將此類型賦值給了bytes[3],(可以看成一個byte類型的變量)
...由於byte類型只有一個字節(可以看出截取的是低八位)
...bytes[3] = 1111 1111
...注意,此時最高位已經爲1了
輸入結果,經過 -1 ,取反,計算.得到結果爲絕對值是1,加上負號,所以屏幕打印 -1
2.Java中的Integer.toBinaryString( x)方法是將x強制轉換成int類型,再以二進制在控制檯輸出,其他方法類似.
3.String中的getBytes(),是從指定字符串用操作系統默認的解碼格式獲取字節流.當然,括號內可以指定解碼方式.
...已知: utf-8下:科這個字二進制編碼:
...1110 0111 1010 0111 1001 0001
public class Test{
public static void main( String[] args){
String s = "科";//""是指字符串,''指的是char.注意
byte[] bytes = s.getBytes();//我的系統默認解碼是utf-8
for( byte b :bytes{
System.out.println(Integer.toBinaryString(b));
}
}
}
//輸出結果:
// 1111 1111 1111 1111 1111 1111 **1110 0111**
// 1111 1111 1111 1111 1111 1111 **1010 0111**
// 1111 1111 1111 1111 1111 1111 **1001 0001**
...可以看出,最後一個字節正是真正的byte的實際內容,三個字節編
...碼一個字符
...還有一個有趣的內容:可以看到,低八位是真正的字節,但是
...其餘三位填充的不是0,而是1.不知道爲什麼,應該和
...字符串脫不開關係