基礎數據類型的相互轉換
在 Java 中,對於基礎的數據類型轉換是學習的重點之一, 只有知道了轉換規則才能避免轉換過程中遇到的一些坑。本篇就來說說數據類型之前的轉換規則。
對於基礎類型的轉換有兩種方式。 一種由小到大的轉換, 不會丟失精度。另一種由大變小的強制轉換, 有可能有丟失精度和出錯。
對於基礎類型的轉換, Java 語言一共提供了 7 種數值類型進行相互轉換。
根據現有規則把數據類型的轉換分為了兩種情況, 一種是自動轉換, 另一種是強制轉換。
轉換規則(從小到大)

自動轉換
從小轉到大的範圍情況下可以自動轉換, 也可以叫作隱式轉換。按照數據類型的從小到大自動進行轉換。
對於自動轉換的規則遵守下面兩個規則:
- 對於需要轉換的數據類型必須要是轉換前的數據類型兼容轉換後的數據類型。
- 轉換後的數據類型的範圍必須比轉換前的數據類型範圍大。
代碼演示:

byte byteValue = 'a'; // 'a' ASCII is 97
short shortValue = byteValue; // 97
int intValue = shortValue; // 97
long longValue = intValue; // 97
float floatValue = longValue; // 97
double doubleValue = floatValue; // 97
System.out.println(doubleValue); //97
char charValue = 'a';
int intCharValue = charValue; // 97
System.out.println(intCharValue);運行查看:

『
以上是一級一級的往上轉換。 所以不會出現問題, 哪怕是跳級也是可以的。
比方說:
byte byteVal = 'b';
int intVal = byteVal;或者是:
int intVal2 = 100;
double d = intVal2;這樣也沒有問題。但是如果是下面這樣就有問題了。
long longVal = 100;
//這裡會報錯。Type mismatch: cannot convert from long to int
int intVal3 = longVal; 如果非要這樣轉,並且轉換前的數據也是能夠和更小類型兼容, 就需要使用強制轉換。
強制轉換
強制轉換, 代表着數據類型的轉換默認無法進行轉換, 所以需要顯式的進行類型轉換。
強制類型轉換的格式為在變量的名字前面加上括號寫上基礎類型。
格式:(需要轉換的基礎類型)變量;
long longValWait = 100;
int intConvert = (long)longValWait;想要詳細的了解強制類型轉換, 需要先了解下面的這個圖:

佔用位元組大的數據類型轉換位元組小的就需要強制轉換。 並且轉換的時候需要注意丟失精度的問題。
讓我看一個會丟失精度的代碼例子:

定義個 short , 規矩定義的規則我們可以得知 byte 的取值範圍是: -128 到 127。所以當我們定義了不在改取值範圍的值時, 比方例子中的 128 就會丟失精度。 讓我們看一下丟失的數值跑哪去了。
首先可以看到 short 的位元組是 2 , 也就是佔用 16 bit,但是 byte 只佔用 1 位,也就是 8 bit。所以在轉換的時候, short 的前 8 bit 被丟了。

並且在類型中, 最左側的是符號位。8 位的符號位也就是1。在計算機處理二進制數的時候, 符號位 1 代表負值, 0 代表正值。所以後面 7 位代表數據的值。又因為負數在計算機中以補碼形式存在的。 所以還需要轉換成原碼進行計算。也就是符號位不變的情況下,將後面 7 位二進制數即按位取反。並在最後一位加 1。

這個時候就遇到了一個特殊的情況也就是 -128 的來源。因為 +0 和 -0 是一樣的。但是對於 0 帶符號來說沒有意義。而且會有 [0000 0000] 和 [1000 0000] 兩個原碼。所以也就有了現在的補碼。
補碼是為了解決 0 的符號兩個編碼的問題。在補碼運算中 [1000 0000] 就是 -128。也就得出來了我們的輸出值 -128。
讓我們看一下 129 的計算方式:
首先知道 129 的二進制是 [1000 0001],轉換成 8 bit之後就變成首尾符號位為負數,
然後得出補碼 [11111 1111] 也就是 -127 了。

從這裡我們也就可以根據補碼知道了 byte 數據類型的取值範圍:
[1111 1111] ~ [0111 1111] 也就是 -128 ~ 127。
這裡總結一下原碼, 反碼,補碼的大概含義。
原碼:原碼就是用第一位表示符號,其餘位表示值,就如同上面的 16 位 [0000 0000 1000 0001]。
反碼: 正數的反碼是原碼本身, 負數的反碼是在原碼的基礎上, 其餘各個位取反。
上面的值就變成:[0000 0000 1000 0001]
補碼:正數的補碼就是其本身, 負數的補碼就是在原碼的基礎上, 其餘的各位都取反,並在最後一位 + 1。也就是在反碼的基礎上 +1。
最終的補碼變成:[0000 0000 1000 0001] 也就是129。
從這裡也就可以看出來, 我們在進行數據處理的時候盡量不要用位數大的數據類型轉換成小的數據類型, 除非你很清楚這樣轉換沒有問題。
浮點類型的強制轉換
以上說的都是整數的強制轉換問題, 浮點型的也可以轉換。 這裡做兩個演示。

這裡就是要引入浮點和整型進行轉換或者運算的時候出現的問題。對於金融來說, 很少使用 float 和 double 進行運算和使用。推薦使用 BigDecimal 對象。具體為什麼。了解原理可以參閱 : IEEE 754標準。後期有時間再寫一篇詳細的原因。主要還是二進制位的運算區別。
數據類型的轉換, 先說到這裡吧。 關注我。 後續更多基礎到實戰的內容。雖慢但永不停更。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/222436.html
微信掃一掃
支付寶掃一掃