Java基本數據類型的轉換
今天我們來討論一下java中6種基本數據類型的轉換。它們分別是:byte,short,int,long,double,float。
記住一點,數據範圍小的類型轉換成範圍大的類型,是不會出現問題的。但是如果是範圍大的數據類型往範圍小的類型去轉換,就可能會出現問題了。我將6種類型的互轉分成30種類型,下面我們將這30種類型都實踐一下。每種類型的轉換,我這裡分4種情況,正數的轉換,負數的轉換,臨界值(最大值和最小值)的轉換,邊界外的轉換,邊界內的轉換。
byte -> short
// 正數byte a = 1;
// 負數byte b = -1;
// 最大值byte c = 127;// 最小值byte d = -128;System.out.println((short)a); // 1System.out.println((short)b); // -1System.out.println((short)c); // 127System.out.println((short)d); // -128System.out.println((short)(c+a)); // 128System.out.println((short)(d+b)); // -129我們首先看上面的代碼塊。發現這五種情況的轉換,結果都是正確的。這是因為short類型能夠表示的範圍大於byte類型,所以是不會出現問題。
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我們會發現只有前面兩個輸出是對的 其他都是錯誤的。下面我們就來分析一下 為什麼會出現這樣的情況。
首先來看c(32767)在計算機是怎麼存儲的。我們都知道計算機存儲數據都是按二進位來存儲的,因此將c的值轉換成二進位就是如圖下:

如果是範圍大類型轉換成範圍小的類型,計算機就會採取截取的方式,注意截取是從高位開始的。因為short是2個位元組,byte是1個位元組,因此被截取之後的結果如下:

提示
截取的時候,計算機是不知道哪一位是用來表示符號位的,因此,截取之後有可能符號位跟截取之前不一致。
截取之後符號位是1。說明截取之後,該數變成了一個負數。在以前的文章裡面說過,對於負數,計算機是採用補碼的形式進行存儲的。那麼我們就來推算一下該種數據對應的原碼是多少:

最下面的一行就是其對應的原碼。所以c的值被強行轉換成short之後變成了-1。
下面我們來看一下d(-32768)為什麼轉成short之後是0?首先我們來看一下計算機是怎麼存儲這個數的。
-32768轉換成二進位是:

從最高位截取,因此就只剩下了8個0,因此轉換成10進位就是0。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/222465.html
微信掃一掃
支付寶掃一掃