C++基礎1 -- 基本內建型別

2020-08-11 23:14:58

1.1 基本內建型別

C++定義了一套包括算術型別和空型別在內的基本數據型別。算術型別包含字元、整型數、布爾值和浮點數。空型別不對應具體的值,最常見的是函數不返回任何值時返回空型別。

1.1.1 算術型別

算術型別分爲整型和浮點型,下表是是對整型和浮點型別說明和含義,以及C++標準規定的最小尺寸。

型別 含義 最小尺寸
bool 布爾型別 未定義
char 字元 8位元
wchar_t 寬字元 16位元
char16_t Unicode字元 16位元
char32_t Unicode字元 32位元
short 短整型 16位元
int 整型 16位元
long 長整型 32位元
long long 長整型 64位元
float 單精度浮點數 6位有效數位
double 雙精度浮點數 10位有效數位
long double 擴充套件精度浮點數 10位有效數位

整型說明:
bool 的取值是真(true)或者假(false)

C++提供了幾種字元型別:char是基本字元型別,一個char的大小和一個機器位元組一樣,wchar_t可以存放機器基本字元集中的任意字元,char16_t和char32_t則爲Unicode字元集服務。

除去布爾型別和字元型別之外,其他整型可劃分爲帶符號的(signed)和無符號的(unsigned)兩種。帶符號型別可以表示正數、負數和0,無符號型別只能表示大於等於0的值。

型別int、short、long和long long 都是帶符號的,通過在型別名前加unsigned 就可以得到無符號型別。型別unsigned int可以縮寫爲unsigned。

與其他整型不同,字元型別被分爲了char、signed char 和unsigned char三種。需要注意,和整型不同,char和signed char並不一樣。儘管字元型別有三種,但是字元的表現形式卻只有帶符號和無符號兩種,char的表現形式由編譯器決定。

浮點型說明:
浮點型可以表示單精度、雙精度和擴充套件精度。通常,float以一個字(32位元)來表示,double以2個字(64位元)來表示,long double 以3或者4個字(96或者128位元)來表示。一般來說,float和double分別爲7和16個有效位,long double 常被用於特殊浮點需求的硬體,它的具體實現不同,精度也各不相同。

如何選擇型別:
1.當明知曉數值不可能爲負數時,選用無符號型別。
2.使用int執行整數運算。在實際使用中,short常常顯得太小而long一般和int有一樣的尺寸。如果你的數值超過了int,選用long long。
3.在算術表達式裡不要用char和bool。因爲char在一些機器上是有符號的,而另外一些機器上又是無符號的,使用char進行執行特別容易出錯。如果你需要使用一個不大的整數,那麼要明確指定它的型別是signed char 或者unsgined char。
4.執行浮點運算選用double。因爲float通常精度不夠而且雙精度浮點數和單精度浮點數的計算代價相差無幾。

1.1.2 型別轉換

物件的型別定義了物件能包含的數據和能參與的運算,其中一種運算被大多數型別支援,就是將物件從一種給定的型別轉換爲另一種型別

含有無符號型別的表達式
儘管我們不會故意給無符號物件賦一個負數,卻可能寫出這樣的程式碼。例如,當一個算術表達式中既有無符號數又有int值時,那個int值就會轉化爲無符號數。把int轉化成無符號數的過程和把int直接賦給無符號變數一樣:

unsigned u = 10;
int i = -42;
std::cout << i+i << std::endl; //輸出-84
std::couyt << u+i << std::endl; //如果int佔32位元,輸出4294967264

在第一個表達式裡,兩個負整數相加得到了期望的結果。在第二個表達式時,相加前先把-42轉化成了無符號數,-42轉成無符號相當於對-42取二補數,即先求-42的反碼,再加1,得到的結果再加10。

當從無符號數減去一個值時,不管這個值是不是無符號數,我們都必須確保結果不能是一個負數:

unsigned u1=42, u2=10;
std::cout << u1-u2 << std::endl; //輸出32
std::couyt << u2-u1 << std::endl; //結果是-32取模後的值

//下面 下麪for回圈會進入死回圈,因爲當u=0時,--u得到-1,由於u是unsigned型別,所以u的值是-1會被轉成無符號
//如果int是32位元,則--u的結果是4294967295,結果大於等於0
for(unsigend u=10; u>=0; --u)
{
	std::cout << u << std::endl;
}

切勿混用帶符號和無符號型別,當帶符號型別取值爲負時會出現異常結果,這是因爲帶符號型別會自動轉換爲無符號型別。

1.1.3 字面值常數

整型字面值
我們可以將整型字面值寫作十進制、八進制和十六進制的形式。以0開頭的整數表示八進制,以0x或者0X開頭的整數表示十六進制。沒有0、0x、0X開頭的表示十進制。

 20(十進制)                       024(八進制)                          0x14(十六進制)

預設情況下十進制字面值是帶符號數,八進制和十六進制字面值即可能帶符號也可能是無符號的。儘管整型字面值可以儲存帶符號數據型別,但是嚴格來說,十進制字面值不會是負數。如果我們使用了一個形如-45的負十進制字面值,那個負號並不在字面值之內,它的作用僅僅是對字面值取負值而已。

浮點型字面值
浮點型字面值表現表現爲一個小數或以科學計數法表示的指數,其中指數部分用E或者e表示。

 3.1415926               3.1415926E0            0.             0e0            .001  

字元和字串字面值
由單引號括起來的一個字元成爲char型字面值,雙引號括起來的零個或多個字元則構成字串型字面值

'a' //字元字面值
"aaa" //字串字面值

跳脫序列
有兩類字元不能直接使用:一類是不可列印字元,如退格或者其他控制字元,因爲他們沒有可視字元;另一類是在C++語言中有特殊含義的字元(單引號,雙引號,問號,反斜槓等)。這些情況需要用到跳脫序列,跳脫序列以反斜線爲開始:

符號 含義
\n 換行符
\v 縱向製表符
\ 反斜線
\r 回車符
\t 橫向製表符
\b 退格符
? 問號
\f 進紙符
\a 報警符
\「 雙引號
\‘’ 單引號

也可以使用泛化的跳脫序列,其形式是\x後緊跟1個或多個十六進制數位,或者\後緊跟1個、2個或者3個八進制數,其中數位部分表示的是字元對應的數值。假設使用Latin-1字元集,一下是一些範例:

符號 含義
\7 響鈴
\0 空字元
\12 換行符
\115 字元M
\40 空格
\x4d 字元M

注意如果反斜線\後面跟着的八進制數位超過3個,只有前面3個數字與\構成跳脫序列。相反,\x要用到後面跟着的所有數位。

指定字面值型別
通過新增下表所列的字首或者後綴,可以改變整型、浮點型和字元型字面值的預設型別

字元和字串字面值

字首 含義 型別
u Unicode 16字元 char16_t
U Unicode 32字元 char32_t
L 寬字元 wchar_t
u8 UTF-8(僅用於字串字面常數) charf

整型字面值

後綴 最小匹配型別
u or U unsigned
l or L long
ll or LL long long

浮點型字面值

後綴 型別
f or F float
l or L long double

true和false是布爾型別字面值
nullptr是指針字面值