C++基本概念——常用基本內置類型

本文的主要目的是介紹C++基本內置類型的分類、實現、使用和類型轉換相關的內容。

1. 基本內置類型的分類

基本內置類型的分類


(1) 關於這個分類,首先我們要弄明白爲什麼C++中要有類型的概念?

數據在計算機中都是按照01比特串的形式存儲的,而數據類型決定了數據所佔用的比特數。例如,C++中char常佔8bit,而int常佔16bit,不同的數據類型佔用不同的比特數目。其次,數據類型也決定了計算機如何解釋這些比特的內容。例如,對於float類型而言,不同的機器實現方式有着很大的區別(此方面的詳細細節可以參考《計算機組成與原理》中的相關內容)。從上面的分析,我們看以看出,實際上C++的數據類型實際上是對01比特串的一種抽象概括,有了數據類型的概念之後,計算機在01比特串上的操作將會更加的方便快捷。

(2)對於不同的數據類型,我們應該如何進行選擇呢?

C++語言在設計之初,就儘可能在遵循接近硬件的原則,由於硬件本身的複雜性,也導致了C++數據類型的複雜性。複雜性和靈活性往往都是相對的,程序員應該儘可能的選用合適的數據類型,來簡化相關操作。下面是計算機數據類型選擇的經驗準則:

  • 當明確知道數據類型不可能爲負時,就選用無符號類型。
  • 使用int進行整數運算。
  • 在算數表達式中儘量不要使用char或者bool
  • 執行浮點數的運算選用double,這是因爲float的精度通常太低,而且代價和double不相上下。

2.類型轉換

(1)我們爲什麼需要類型轉換?

在實際使用數據類型的過程中,我們不可避免的會遇到不同的數據類型的混合使用。例如,

int i=45;
 if(i)  //int converts to bool
 statement;

這種寫法非常簡潔,當然也可以使用if(i>0)的書寫形式,但是顯然不夠簡潔,美觀。當然這只是使用類型轉換的原因之一。再比如說,我們常常需要不同類型之間的四則運算,等等。

(2)怎樣進行數據類型的轉換?

對象的類型定義了對象包含的數據和能參與的運算,類型表示的範圍決定了轉換的過程,主要包括隱式類型轉化和顯示類型轉換

①隱式類型轉換

隱式類型轉換指的是編譯器自動執行的類型轉換,這些類型會在編譯器進行語句翻譯的時候自動執行,常見的隱式類型轉換有以下幾種情況:

  • 整型提升,類型小的整型會提升爲類型大的整型。例如,非布爾型到布爾型的轉換,true爲1,false爲0。
  • 非布爾型到布爾型的轉換,大於0爲true,小於0爲false。
  • 算術表達式或者關係表運算中的多種類型,需要轉換爲同一種類型。
  • 函數調用的時候也會發生類型轉換
  • 數組轉換成指針:大多數用到數組的表達式中,數組自動轉換成指向數組元素的指針。

    int a[10];
    int *ip=a;
  • 無符號類型之間的轉換,轉換規則如下:
Created with Raphaël 2.1.0開始類型不一致?整型提升符號不相同?unsigned>=sign?sign轉換成unsigned結束unsigned轉化爲sign小範圍提升爲大範圍yesnoyesnoyesno

對於上圖有以下幾個方面需要注意:

——- 進行類型轉化時,首先進行符號判斷,進行整型提升,如果類型一致則結束,否則繼續進行判斷
——– 接着對兩個相異符號的兩個數的類型大小進行比較,將其中一個轉換爲表示範圍大的。

  • 轉換成常量
int i;
const int &j=i;
int &r=j;//錯誤,不能將const引用轉換爲非const
  • 類型定義的轉換,類中定義的轉換構造函數

①顯示類型轉換

顯示類型轉換指的是程序員指定的類型轉換,往往存在類型損失。常見的形式有:
- static_cast,除去底層之外的const轉換

int j=10;
double i=12.23;
double slope=static_cast<double>(j)/i;
  • const_cast,底層const
const char *ps;
char *pc=const_cast<char*>(pc);
  • reinterpret_cast
int *ip;
char *cp=reintepret_cast<char*>(ip);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章