程式設計基礎/資料型別轉換
更改值的資料型別被稱為“型別轉換”。有兩種方法可以做到這一點
- 隱式 - 更改是隱含的
- 顯式 - 更改是透過運算子或函式顯式執行的
要更改的值可能是
- 提升 - 從較小的域到較大的域
- 降級 - 從較大的域到較小的域
程式語言在沒有程式設計師明確指示的情況下,自動將值從一種資料型別轉換為另一種資料型別,稱為隱式型別轉換。它發生在二元運算子具有兩種不同資料型別的運算元時。根據運算子,其中一個運算元將被轉換為另一個運算元的資料型別。它可以根據運算子進行提升或降級。
隱式提升
55 + 1.75
在此示例中,整數 55 被轉換為浮點值(很可能是 double) 55.0。它被提升了。
隱式降級
在具有顯式整數資料型別的程式語言(C++、C#、Java)中,必須注意避免隱式降級。例如
int money;
money = 23.16;
在此示例中,變數 money 是一個整數。我們試圖將浮點值 23.16 移動到整數儲存位置。這是降級,浮點值通常會截斷為 23。
提升永遠不會有問題,因為較低的資料型別(較小的允許值範圍)是較高資料型別(較大的允許值範圍)的子集。提升通常發生在三種標準資料型別中:字元、整數和浮點。允許的值(或域)從一種型別到另一種型別進行。也就是說,字元資料型別的值是整數值的子集,而整數值是浮點值的子集;在浮點值中,float 值是 double 的子集。即使字元資料表示字母、數字(0 到 9)和其他符號(句點、$、逗號等),它們的位模式也代表從 0 到 255 的整數值。這種進展允許我們從字元提升到整數,再到 float,最後到 double。
降級代表一個潛在問題,可能會發生截斷或不可預測的結果。你如何將 456 的整數值放入字元值中?你如何將 45656.453 的浮點值放入整數值中?大多數編譯器如果檢測到降級正在發生,會發出警告。編譯器警告不會停止編譯過程。它確實警告程式設計師檢查降級是否合理。
如果我根據要服務的人數(比如 8 人)和每罐的份數(比如 2.3 人)來計算要購買的湯罐數量,我需要 18.4 罐。我可能想要將 18.4 降級為整數。它會將 18.4 截斷為 18,因為值 18 在整數資料型別的域內,所以它應該在發生截斷副作用的情況下降級。
如果我試圖將包含銀河系中恆星數量的 double 值降級為整數,我可能會得到一個不可預測的結果(假設恆星數量大於整數域內允許的值)。
大多數語言都有一種方法可以讓程式設計師將值從一種資料型別更改或轉換為另一種資料型別;稱為顯式型別轉換。某些語言支援強制轉換運算子。強制轉換運算子是單目運算子;它只有一個運算元,並且運算元在運算子的右側。該運算子是一組圍繞新資料型別的括號。其他語言具有執行顯式型別轉換的函式。在以下每個示例中,表示式的值為 3。
| 語言 | 浮點到整型型別轉換示例 |
|---|---|
| C++ | (int) 3.14
|
| C# | Convert.ToInt32(3.14)
|
| Java | Math.floor(3.14)
|
| JavaScript | Math.floor(3.14)
|
| Python | int(3.14)
|
| Swift | Int(3.14)
|
在以下每個示例中,表示式的值為 3.14。
| 語言 | 字串到浮點型別轉換示例 |
|---|---|
| C++ | #include <string.h>std::stod("3.14") |
| C# | Convert.ToDouble("3.14")
|
| Java | Double.parseDouble("3.14")
|
| JavaScript | parseFloat("3.14")
|
| Python | float("3.14")
|
| Swift | Double("3.14")
|
- 降級
- 從較大的域到較小的域。
- 顯式
- 使用強制轉換運算子更改值的型別。
- 隱式
- 自動更改資料型別的值。
- 提升
- 從較小的域到較大的域。
- 截斷
- 浮點資料型別在轉換為整數時被丟棄的小數部分。