int類型128轉byte類型後爲什麼是-128?

先看一下代碼:


public class Test {

	public static void main(String[] args) {
           int a = 128;
           byte b = (byte)a;
           System.out.println("a:"+a);
           System.out.println("b:"+b);

           }
}

輸出結果爲:

a:128
b:-128

這是爲什麼呢?

因爲int的長度爲32個bit位 所以在int中128的二進制表示爲 0000 0000 0000 0000 0000 0000 1000 0000
java在強轉時 如果是長位轉短位保留與短位數相同的長位末尾的二進制值,
如:int 32位轉byte 8位時只保留int 32位中的最後8位
如上代碼:int a = 128; byte b = (byte)a;
代碼中a的二進制值爲:0000 0000 0000 0000 0000 0000 1000 0000
當它強制轉換成byte類型時,其二進制值爲1000 0000(保留了int 32位的末尾8位)
因爲byte只有8位,所以將int 32位中前24個0都去掉了
在byte類型中 二進制1000 0000 代表的10進制值爲 -128
所以上面的代碼輸出的結果爲:a:128  b:-128

有的同學會問了,爲什麼byte中1000 0000 爲 -128呢?

答:在計算機中數字二進制 最高位爲符號位,1代表負值,0代表正值。
       你可能又會問那1000 0000 不應該是 -0麼?因爲首位爲1代表當前的值爲負值
        如果1000 0000是-0,然後0000 0000 是0,那就會出現兩個0,會浪費一個bit空間。
        所以呢符號位僅爲1還不行又爲了便於二進制的加減操作,還要對負值的二進制的原碼進行反碼和補碼,
        計算機中負值的表示爲:二進制除符號位以外,對原碼進行取反,然後再進行補碼(就是反碼後再加1)
        例如 byte中的-1就應該這樣表示:
        -1的原碼 1000 0001 
        -1的反碼 1111 1110(符號位不變)
        -1的補碼 1111 1111(反碼加1)
         所以byte中的-1 在計算機中的表現形式就爲 1111 1111
         
         至於byte中的1000 0000 爲-128是怎麼算出來的,查了很多資料我也沒搞清楚
         雖然不知道怎麼算的,但是這個結果也是可以推斷出來
         -125是  1000 0011
         -126 是 1000 0010 
         -127是  1000 0001
         -128是  1000 0000
          
      結論:

  1.  負值首位肯定是1
  2.  二進制符號位後面的值越小,十進制值越小

         如:1000 0001 爲-127
                  1111 1111 爲 -1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章