Java基本數(shù)據(jù)類型的轉(zhuǎn)換
Java基本數(shù)據(jù)類型的轉(zhuǎn)換
今天我們來(lái)討論一下java中6種基本數(shù)據(jù)類型的轉(zhuǎn)換。它們分別是:byte,short,int,long,double,float。
記住一點(diǎn),數(shù)據(jù)范圍小的類型轉(zhuǎn)換成范圍大的類型,是不會(huì)出現(xiàn)問(wèn)題的。但是如果是范圍大的數(shù)據(jù)類型往范圍小的類型去轉(zhuǎn)換,就可能會(huì)出現(xiàn)問(wèn)題了。我將6種類型的互轉(zhuǎn)分成30種類型,下面我們將這30種類型都實(shí)踐一下。每種類型的轉(zhuǎn)換,我這里分4種情況,正數(shù)的轉(zhuǎn)換,負(fù)數(shù)的轉(zhuǎn)換,臨界值(最大值和最小值)的轉(zhuǎn)換,邊界外的轉(zhuǎn)換,邊界內(nèi)的轉(zhuǎn)換。
byte -> short
// 正數(shù)
byte a = 1;
// 負(fù)數(shù)
byte b = -1;
// 最大值
byte c = 127;
// 最小值
byte d = -128;
System.out.println((short)a); ? // 1
System.out.println((short)b); ?// -1
System.out.println((short)c); ?// 127
System.out.println((short)d); ?// -128
System.out.println((short)(c+a)); ?// 128
System.out.println((short)(d+b)); ?// -129
我們首先看上面的代碼塊。發(fā)現(xiàn)這五種情況的轉(zhuǎn)換,結(jié)果都是正確的。這是因?yàn)閟hort類型能夠表示的范圍大于byte類型,所以是不會(huì)出現(xiàn)問(wèn)題。
short -> byte
short a = 1;
short b = -1;
short c = Short.MAX_VALUE; // 32767
short d = Short.MIN_VALUE; // -32768
short f = 128;
short g = -129;
System.out.println((byte)a); ? // 1
System.out.println((byte)b); ?// -1
System.out.println((byte)c); ?// -1
System.out.println((byte)d); ?// 0
System.out.println((byte)(c+a)); ?// 0
System.out.println((byte)(d+b)); ?// -1
System.out.println((byte)f); ? // -128
System.out.println((byte)g); ?// 127
我們會(huì)發(fā)現(xiàn)只有前面兩個(gè)輸出是對(duì)的 其他都是錯(cuò)誤的。下面我們就來(lái)分析一下 為什么會(huì)出現(xiàn)這樣的情況。
首先來(lái)看c(32767)在計(jì)算機(jī)是怎么存儲(chǔ)的。我們都知道計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)都是按二進(jìn)制來(lái)存儲(chǔ)的,因此將c的值轉(zhuǎn)換成二進(jìn)制就是如圖下:

如果是范圍大類型轉(zhuǎn)換成范圍小的類型,計(jì)算機(jī)就會(huì)采取截取的方式,注意截取是從高位開始的。因?yàn)閟hort是2個(gè)字節(jié),byte是1個(gè)字節(jié),因此被截取之后的結(jié)果如下:

提示
截取的時(shí)候,計(jì)算機(jī)是不知道哪一位是用來(lái)表示符號(hào)位的,因此,截取之后有可能符號(hào)位跟截取之前不一致。
截取之后符號(hào)位是1。說(shuō)明截取之后,該數(shù)變成了一個(gè)負(fù)數(shù)。在以前的文章里面說(shuō)過(guò),對(duì)于負(fù)數(shù),計(jì)算機(jī)是采用補(bǔ)碼的形式進(jìn)行存儲(chǔ)的。那么我們就來(lái)推算一下該種數(shù)據(jù)對(duì)應(yīng)的原碼是多少:

最下面的一行就是其對(duì)應(yīng)的原碼。所以c的值被強(qiáng)行轉(zhuǎn)換成short之后變成了-1。
下面我們來(lái)看一下d(-32768)為什么轉(zhuǎn)成short之后是0?首先我們來(lái)看一下計(jì)算機(jī)是怎么存儲(chǔ)這個(gè)數(shù)的。
-32768轉(zhuǎn)換成二進(jìn)制是:

從最高位截取,因此就只剩下了8個(gè)0,因此轉(zhuǎn)換成10進(jìn)制就是0。