r語言lag函數用法:java怎麼把負數轉正數

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的值轉換成二進制就是如圖下:

Java基本數據類型的轉換

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

Java基本數據類型的轉換

提示

截取的時候,計算機是不知道哪一位是用來表示符號位的,因此,截取之後有可能符號位跟截取之前不一致。

截取之後符號位是1。說明截取之後,該數變成了一個負數。在以前的文章裏面說過,對於負數,計算機是採用補碼的形式進行存儲的。那麼我們就來推算一下該種數據對應的原碼是多少:

Java基本數據類型的轉換

最下面的一行就是其對應的原碼。所以c的值被強行轉換成short之後變成了-1。

下面我們來看一下d(-32768)為什麼轉成short之後是0?首先我們來看一下計算機是怎麼存儲這個數的。

-32768轉換成二進制是:

Java基本數據類型的轉換

從最高位截取,因此就只剩下了8個0,因此轉換成10進制就是0。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/222465.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:10
下一篇 2024-12-09 14:10

相關推薦

發表回復

登錄後才能評論