1. 程式人生 > >C++中,混合數值型別

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 發生了溢位。