例1:
public class test {
public static void main(String[] args) {
byte a = 127 ;
a = (byte)(a+3) ;
System.out.println(a);
}
}
輸出-126,為什么呢
byte類型的取值范圍是-128-127
這個輸出結果是由java編碼方式決定的,Java中正數用原碼表示,負數用補碼表示,第一位是符號位。
對於127他的編碼是:
0000 0000 0000 0000 0000 0000 0111 1111
加上3也就是130。他的編碼是:
0000 0000 0000 0000 0000 0000 1000 0010
使用強制轉型后,a的編碼就變成:
1000 0010
由於java第一位為1的為負數。負數用補碼表示,所以要顯示原碼,要取反加1:
這樣就變成 0111 1110
這樣就是126加上符號。結果就是-126
例2:
public class test {
public static void main(String[] args) {
short a = 128 ;
byte b = (byte)a ;
System.out.println(b);
}
}
輸出-128,為什么呢
同上:
a的編碼是:
0000 0000 1000 0000
強制轉型后變為1000 0000
由於java第一位為1的為負數,負數用補碼表示,所以要顯示原碼,要取反加1:
還是1000 0000
這樣就是128加上符號。結果就是-128
例3:
public class test {
public static void main(String[] args) {
byte a = (byte)(-129) ;
System.out.println(a);
}
}
輸出127。為什么呢
同上:
a的補碼是:
1000 0000 0000 0000 0000 0000 1000 0001
a的原碼是:
0111 1111 1111 1111 1111 1111 0111 1111
強制轉換。取后面8個字節,也就是
0111 1111
所以結果是127
