官术网_书友最值得收藏!

2.3 數據類型

使用C++語言可以處理大量種類繁多的數據。為了方便處理,C++語言的標準會將數據分為不同類型,也就是數據類型。每種數據類型所占的內存空間會有所不同。

2.3.1 什么是進制

進制也就是進位計數制,是人為定義的帶進位的計數方法。生活中能接觸到的進制一般有兩種,一種是十進制,也就是“逢十進一”,在計數時會經常使用;另一種是五進制,也就是“逢五進一”,在班級投票選舉中常用,也就是寫“正”字,每滿五票可以寫一個“正”字,方便統計票數。

計算機使用的進制為二進制,每位可以使用0與1這兩個整數表示,遵循“逢二進一”的規則。二進制也可以稱為機器碼,一般編程人員不用編寫,主要用于底層開發或者機器識別。在計算機中數據會以二進制形式進行存放,如圖2.4所示。

img

圖2.4 二進制數據

以下重點對二進制進行講解。

1.二進制表示

二進制數據是用0和1兩個數碼來表示的數。它的基數為2,并且每一個數都會使用括號括起來,如圖2.5所示。

img

圖2.5 二進制

二進制數1001的表示形式如下。

img

2.進位規則

進位規則為“逢二進一”,即兩數相加時低位滿二就向高位進一,進上去的1在高位進行運算時用到,如圖2.6所示。此圖是兩個二進制數進行加法運算。

img

圖2.6 進位規則

3.借位規則

借位規則為“借一當二”,即當兩個數相減時,被減數的低位小于減數的低位時,向高位借一,看成2加在被減數上,再去減減數,低位向高位借走的1,在借走的高位做運算時用到,如圖2.7所示。此圖是兩個二進制數進行減法運算。

img

圖2.7 借位規則

2.3.2 C++支持的進制

在C++語言中,開發者可以使用二進制、八進制、十進制與十六進制四種進制在代碼中書寫整數。接下來將對這四種進制進行詳細介紹。

1.二進制

書寫二進制的整數時,需要為整數添加一個前綴“0b”或“0B”,如圖2.8所示。

img

圖2.8 二進制數書寫規范

示例2-1】下面將一個二進制數以十進制數形式輸出。

img

程序運行結果如下。

img

0b1001中的0b為二進制標識,告知計算機該數為一個二進制數,然后系統會在屏幕輸出十進制數。

二進制數轉換為十進制數的方法如圖2.9所示。

img

圖2.9 二進制數轉換為十進制數

在轉換中,將二進制數從低位到高位依次使用2的次冪進行替換,然后與二進制數0或1進行對位相乘,最后將所有乘積相加,得出二進制數對應的十進制數。

2.八進制

八進制數的每一位都可以使用0~7這八個整數,遵循“逢八進一”的規則。書寫八進制的整數時,需要為整數添加一個前綴數字“0”,如圖2.10所示。八進制常在關卡中使用,比如游戲中關卡一般都是8個大關卡,每個大關卡有8個小關卡。

img

圖2.10 八進制數書寫規范

示例2-2】下面將一個八進制數以十進制數形式輸出。

img

程序運行結果如下。

img

八進制數轉換為十進制數的方法如圖2.11所示。

img

圖2.11 八進制數轉換為十進制數

在轉換中,將八進制數從低位到高位依次使用8的次冪進行替換,然后與八進制數進行對位相乘,最后將所有乘積相加,得出八進制數對應的十進制數。

二進制數轉換為八進制數就是將二進制數從右向左每三位合并為一位。下面將一個二進制的111111轉換為八進制的077,如圖2.12所示。

img

圖2.12 二進制數轉換為八進制數(1)

在轉換時,有時會發現二進制的位數無法以每三位為單元進行分割,此時就需要使用0來補位。下面將一個二進制的10011011轉換為八進制的0233,如圖2.13所示。

img

圖2.13 二進制數轉換為八進制數(2)

3.十進制

由于人的手指是十個,十進制相對符合人的人體構造,所以十進制是人們最常使用的進制。

十進制數每一位都可以使用0~9共十個整數,遵循“逢十進一”的規則。十進制整數有負值,在書寫時不能以數字“0”開始,但是可以以負號開始,如圖2.14所示。

img

圖2.14 十進制數書寫規范

十進制數轉換為二進制數時要用到輾除法,也就是“除模取余”法。除模取余是指將一個幾進制的數轉換為另一個進制的數時,另一個進制就是模,用將要轉換的進制數除以模,取它的余數。下面將一個十進制的19轉換為二進制的10011,如圖2.15所示。

img

圖2.15 十進制數轉換為二進制數

4.十六進制

隨著計算機處理的數據不斷增加,人們發現使用八進制也無法滿足需求,因此程序員創造出了十六進制。例如,顏色的表示模式分為RGB模式與CMYK模式,其中RGB模式就是使用6位十六進制數來表示顏色,如#FF0000。

十六進制數每一位都可以使用0~9和A~F共16個字符表示,遵循“逢十六進一”的規則。十六進制整數在書寫時需要在整數前加“0x”或“0X”,如圖2.16所示。

img

圖2.16 十六進制數書寫規范

示例2-3】下面將一個十六進制數以十進制數形式輸出。

img

程序運行結果如下。

img

十六進制數轉換為十進制數的方法如圖2.17所示。

img

圖2.17 十六進制數轉換為十進制數

二進制數轉換為十六進制數就是將二進制數從右向左每四位合并為一位。下面將一個二進制的10101100轉換為十六進制的0xAC,如圖2.18所示。

img

圖2.18 二進制數轉換為十六進制數(1)

在轉換時,有時會發現二進制數無法以每四位為單元進行分割,此時就需要在前面使用0來補位。例如,下面將一個二進制的11011轉換為十六進制的0x1B,如圖2.19所示。

二進制、八進制、十進制及十六進制之間的轉換如表2.2所示。對于這個表應該做到熟記于心,可以快速讀懂各種進制的數字。

img

圖2.19 二進制數轉換為十六進制數(2)

表2.2 進制之間的轉換

img

2.3.3 整數類型

計算機硬件的空間是有大小限制的,所以在處理整數數據時需要控制整數所占的空間大小。根據所占空間大小,可以將整數分為四種,即整型、短整型、長整型、長長整型。下面將進行講解。

1.整型

在C++語言中,整型是整數的默認保存類型。整型使用int表示,占4字節,如圖2.20所示。

img

圖2.20 整型

由于存儲所使用的空間有限,整型可以表達的整數范圍為-231~231-1,即-2147483648~2147483647,如圖2.21所示。

img

圖2.21 整型類型的范圍

示例2-4】下面輸出整數的字節長度,判斷整數值是否會被默認保存為整型。

img

程序運行結果如下。

img

sizeof()為一個函數,可以將sizeof()函數簡單理解為一個機器,可以告訴你指定值在內存中的長度。在這里判斷的是整數10在內存中所占字節長度。

示例2-5】下面輸出整型類型占幾字節。

img

程序運行結果如下。

img

2.短整型

短整型可以用于表示數值較小的整數,使用英文字母short表示,占2字節,如圖2.22所示。

img

圖2.22 短整型

短整型可以表示的范圍為-215~215-1,即-32768~32767,如圖2.23所示。

img

圖2.23 短整型類型的范圍

示例2-6】下面輸出短整型占幾字節。

img

程序運行結果如下。

img

3.長整型

C++語言還提供長整型用來保存更大的整數。該類型使用英文字母long表示。在Visual Studio 2019中,長整型使用4字節,如圖2.24所示。

img

圖2.24 長整型

長整型的范圍為-231~231-1,即-2147483648~2147483647,如圖2.25所示。

img

圖2.25 長整型類型的范圍

【示例2-7】下面輸出長整型占幾字節。

img

程序運行結果如下。

img

在書寫的時候長整型要在數字后面加字母l或L,如355L。

示例2-8】下面輸出帶L后綴的數字的字節長度。

img

程序運行結果如下。

img

4.長長整型

C++語言還提供長長整型用來保存更大的整數。該類型使用兩個英文字母long表示,即long long。長長整型使用8字節,如圖2.26所示。

img

圖2.26 長長整型

長長整型的范圍為-263~263-1,即-9223372036854775808~9223372036854775807,如圖2.27所示。

img

圖2.27 長長整型類型的范圍

示例2-9】下面輸出長長整型占幾字節。

img

程序運行結果如下。

img

在書寫的時候長長整型要在數字后面加字母ll或LL,如355LL。

示例2-10】下面輸出帶LL后綴的數字的字節長度。

img

程序運行結果如下。

img

5.無符號整型

無符號整型只能表示0和正數,它會將整型的二進制符號位挪用為整數位。這樣無符號整型的正數范圍會比有符號整型的正數范圍擴大一倍,如圖2.28所示。

在整型類型名稱前添加前綴unsigned,即構成對應的無符號整型。書寫時在數字后面加字母u或U。無符號整型包含以下幾種。

? 無符號整型:使用英文字母unsigned int表示,占4字節,可表示的范圍為0~4294967295。

? 無符號短整型:使用英文字母unsigned short表示,占2字節,可表示的范圍為0~65535。

? 無符號長整型:使用英文字母unsigned long表示,占4字節,可表示的范圍為0~4294967295。

? 無符號長長整型:使用英文字母unsigned long long表示,占8字節,可表示的范圍為0~18446744073709551615。

img

圖2.28 無符號整型4字節

在需要處理的數據只有正整數時,使用無符號整型是十分劃算的,這樣可以更好地利用計算機的空間提高計算效率。

示例2-11】unsigned類型的數據是不會顯示為負數的,如果出現負數會輸出4294967196。下面輸出兩個unsigned 整型數字,一個為正數,一個為負數。

img

程序運行結果如圖2.29所示。

img

圖2.29 程序運行結果

總結前面講解的所有整數類型,共有八種,如表2.3所示。

表2.3 八種整型

img

續表

img

2.3.4 浮點類型

浮點型數據即實數。浮點類型用于處理實數數據,是計算機使用最廣泛的一種類型。浮點數利用指數使小數點的位置可以根據需要而上下浮動,從而可以靈活地表達更大范圍的實數。

根據浮點的精度不同,浮點類型分為單精度類型(float)、雙精度類型(double)和擴展精度浮點類型(long double)。下面進行詳細講解。

1.單精度類型

單精度類型用于保存較小的實數。該類型使用英文字母float表示。float占4字節,如圖2.30所示。單精度的表示范圍為3.4E-38~3.4E+38,有效位為6位。

img

圖2.30 float整型

示例2-12】下面輸出單精度的字節長度。

img

程序運行結果如下。

img

2.雙精度類型

雙精度類型用于保存較大的實數。該類型使用英文字母double表示。double占8字節,如圖2.31所示。雙精度的表示范圍為1.7E-308~1.7E+308,有效位為10位。

img

圖2.31 double整型

示例2-13】下面輸出雙精度的字節長度。

img
img

程序運行結果如下。

img

3.擴展精度浮點類型

擴展精度浮點類型用于有特殊浮點需求的硬件中,具體的實現方式和精度也不太相同。該類型使用英文字母long double表示。long double占8字節,表示范圍為1.7E-308~1.7E+308,有效位為10位。

2.3.5 字符類型和字符串

下面對字符類型進行詳細講解。

1.字符類型

字符類型用于處理字符數據,如人名、字母等。C++語言中,字符類型在內存中占1字節,該類型使用英文字母char表示,其表示數值的范圍為127~-128。

字符型數據的本質是存儲字符的ASCII(American Standard Code for Information Interchange,美國標準信息交換碼)碼值。根據ASCII碼標準,數值65代表大寫字母A,而97則代表小寫字母a,ASCII碼前128個碼的十進制數表示如表2.4所示。

表2.4 ASCII碼表

img

續表

img

在ASCII碼表中的特殊字母組合,其含義如表2.5所示。

表2.5 特殊字符的含義

img

在C++中還有一些是由斜杠和多個字符所組成的,但被當作單一字符處理的特殊字符,它們被稱為轉義字符。轉義字符是不可以被打印的字符,都具有特殊的功能,如表2.6所示。

表2.6 轉義字符

img

續表

img

示例2-14】下面輸出一個水平制表符與八進制數172對應的字符z。字符z的ASCII碼值十進制數為122,轉換為八進制數172。

img

程序運行結果如圖2.32所示。

img

圖2.32 輸出指定轉義字符

2.有符號與無符號字符類型

字符型數據根據有無符號可以分為有符號字符型和無符號字符型。有符號字符型用英文signed char表示,無符號字符型用英文unsigned char表示,其對應的取值范圍如表2.7所示。

表2.7 字符數據類型

img

3.字符串類型

處理單個字符時可以使用字符類型,處理多個字符時就可以使用字符串類型。例如,abcde、Hello、1234這些都是字符串。C++中字符串類型不屬于基礎數據類型,在后面的章節中會進行詳細講解。

2.3.6 布爾類型

布爾類型是用于表達邏輯判斷的一種數據類型。C++語言中,布爾類型使用英文字母bool表示。該類型只有真(true)和假(false)兩個值。使用整數表示時,0表示假,1表示真。布爾類型多用于程序判斷、流程控制及邏輯判斷。簡單理解布爾類型就像做判斷題,只有對和錯兩種結果。

主站蜘蛛池模板: 菏泽市| 阳江市| 永宁县| 九寨沟县| 罗源县| 专栏| 太原市| 齐齐哈尔市| 永丰县| 安福县| 肇州县| 清流县| 高唐县| 利津县| 绍兴市| 潮安县| 隆子县| 佛冈县| 和龙市| 北票市| 菏泽市| 南木林县| 嘉义县| 公安县| 元江| 涟源市| 阿巴嘎旗| 镇安县| 缙云县| 新邵县| 斗六市| 高雄县| 平罗县| 平定县| 大庆市| 民县| 新邵县| 静乐县| 汾阳市| 左云县| 敖汉旗|