1 package 筆試; 2 3 public class ShortToByte { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 short a=128; 11 byte b=(byte)a; 12 System.out.println("short強制類型轉換為byte時,a="+a+","+b); 13 byte a1=(byte)128; 14 byte b1=(byte)(-129); 15 System.out.println("int強制類型轉換為byte時,a1="+a1+",b1="+b1); 16 } 17 18 }
執行結果為:short強制類型轉換為byte時,a=128,-128
int強制類型轉換為byte時,a1=-128,b1=127
跟計算機的數據表示格式有關:負數用補碼表示。
byte類型的數據取值范圍是:-128-127,
例如:byte a=(byte)128;
byte b=(byte)(-129);
a和b得值分別為-128和127.
這個是Java編碼方式決定的,Java中正數用源碼表示,負數用補碼表示,第一位是符號位。
所以對於128和-129,他們的編碼分別是:
0000 0000 0000 0000 0000 0000 1000 0000
和1111 1111 1111 1111 1111 1111 0111 1111。
使用強制類型轉換之后得到的a和b分別是1000 0000和0111 1111。
對於a來說,1000 0000是負數(第一位為1),它的絕對值是1000 0000即128,
而對於b來說,0111 1111是正數,值為127。
強制轉換的截位本身就帶來數據的損失,所以出來的結果比較怪也是正常。