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:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM