天天看點

byte類型取值範圍以及溢出詳解

例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:

        short a = 128 ;  

        byte b = (byte)a ;  

        system.out.println(b);  

輸出-128,為什麼呢

同上:

a的編碼是:

0000 0000 1000 0000

強制轉型後變為1000 0000

還是1000 0000

這樣就是128加上符号,結果就是-128

例3:

        byte a = (byte)(-129) ;  

輸出127,為什麼呢

a的補碼是:

1000 0000 0000 0000 0000 0000 1000 0001

a的原碼是:

0111 1111 1111 1111 1111 1111 0111 1111

強制轉換,取後面8個位元組,也就是

0111 1111

是以結果是127