C++中,混合數值型別
當你在同一個表示式中組合不同的資料型別時,C++會遵循特定的規則,編譯器儘可能地允許混合不同的型別,當有可能資料丟失時會發出警告,並嘗試做出最合適的事情。
接下來為大家介紹幾種最常見的幾種混合資料的情況:整數與浮點數,布林型與整型,有符號整型和無符號整型。
1、整數與浮點數:
在C++中,無論是否有實際的小數點部分,一個帶有小數點的數字都以浮點性儲存,沒有小數點的數字就是整型。在混合表示式中,一個範圍較小的資料會被自動提升為範圍較大的資料。
double x = 0;
在此情況下,0最開始儲存在整型中,由於它被賦值到 x(浮點數),所以在賦值之前,整數0被自動提升到double型別
但是反方向的賦值是有問題的,編譯器會提示警告。
int i = 2.0;
把一個數值轉換為小範圍的型別,會導致編譯器發出有關資料可能丟失的警告。
在這些情況下,為了避免產生警告資訊,可使用 static_cast 運算子,比如
int i = static_cast<int>(2.0);
2、布林與整型:
首先介紹一下在C語言中,判斷一個表示式是否為真,可以通過表示式最終的值去判斷,如果表示式的值為 0 ,則在條件判斷中此表示式為假;若表示式的值為非0的值,則在條件判斷中此表示式的值為真。
C++在繼承此基礎上引入了新的型別:布林型,true 表示真, false 為假。所以在布林型與整型相互轉換的過程中,整型非0 -> true,0 -> false。 false -> 0; true -> 1.
3、有符號整數和無符號整數
在任何型別的算數表示式中使用寬度比int 型別的寬度小的時,它的寬度會被提升(例外:char 型別變數相互賦值時)。
如果某種型別的數字位數比別的數字型別小,那麼較小的數字型別會被提升到較大的型別大小。因此,short 被提升為 long。
如果兩個操作符具有相同的寬度,但一個時有符號的而另一個時無符號的,那麼,有符號的運算元被提升為無符號的運算元。
#include<iostream> using std::cout; using std::endl; int num1; int main() { unsigned num1 = -1; int num2 = -2; cout <<"num1: "<<num1<<endl; cout <<"num2: "<<num2<<endl; cout <<"num1 + num2: "<<num1 + num2<<endl; cout <<"num1 * num2: "<<num1 * num2<<endl; }
執行結果:
從最後的結果來看這兩個數字都被視為有符號數字,因為 (-1 )* (-2 )= 2,然而這裡真正發生的是 num1 * num2 發生了溢位。