Java二進制的存儲與識別

接下來的結論只是真正事實的必要條件,我不能保證充分.我會持續驗證各個結論.

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的實際內容,三個字節編
...碼一個字符
...還有一個有趣的內容:可以看到,低八位是真正的字節,但是
...其餘三位填充的不是,而是.不知道爲什麼,應該和
...字符串脫不開關係

發佈了56 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章