先看一下代碼:
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
- 二進制符號位後面的值越小,十進制值越小
如:1000 0001 爲-127
1111 1111 爲 -1