在Java中,int和long分別是32位和64位有符號(hào)整數(shù)類型。它們可以存儲(chǔ)從-2^(n-1)到2^(n-1)-1(n是位數(shù))之間的整數(shù)。在Java中,負(fù)數(shù)是用補(bǔ)碼表示的。
int a = -5; //a的二進(jìn)制表示為:11111111 11111111 11111111 11111011
當(dāng)我們使用負(fù)數(shù)時(shí),需要注意int和long之間有些細(xì)微的差別,特別是在處理溢出的時(shí)候。例如,當(dāng)我們將一個(gè)足夠大的正數(shù)加上一個(gè)負(fù)數(shù)時(shí),會(huì)發(fā)生溢出。對(duì)于int而言,它會(huì)截?cái)喑鲎约耗芰Ψ秶奈粩?shù);而對(duì)于long,則會(huì)產(chǎn)生負(fù)的高位值。為了更好的理解,可以看下面的代碼:
int a = Integer.MAX_VALUE; //a的值為2147483647 int b = -1; int c = a + b; //c的值為2147483646,沒(méi)有發(fā)生溢出 long x = Long.MAX_VALUE; //x的值為9223372036854775807 long y = -1; long z = x + y; //z的值為9223372036854775806,發(fā)生了溢出
在處理負(fù)數(shù)時(shí)還需要注意,當(dāng)我們使用int類型時(shí),容易發(fā)生精度損失。舉個(gè)例子,如果我們將一個(gè)像-2147483648這樣的負(fù)數(shù)轉(zhuǎn)化為正數(shù),會(huì)失敗:
int a = -2147483648; int b = Math.abs(a); //b的值還是-2147483648
這是由于-2147483648超出了int類型的最大正數(shù)范圍。解決方法是將它轉(zhuǎn)化為更長(zhǎng)的long類型再進(jìn)行轉(zhuǎn)換。例如:
int a = -2147483648; long b = (long) Math.abs(a); //b的值為2147483648
總之,在Java中正確處理負(fù)數(shù)是很重要的,我們需要注意處理好位數(shù)和類型之間的差別。