5 型別轉換
6 references
內建型別包括算數型別和空型別,其中空型別不對應任何具體的值,僅用於一些特殊的場合。
算數型別分為兩類:整型和浮點型。
類別型別
含義最小尺寸
整型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位有效數字
注意:char的大小和乙個機器位元組一樣;long long是c++11新定義的資料型別;浮點數通過有效位數來確定尺寸,而不是位數。
除了布林型和擴充套件的字元型之外,其他整型可劃分為帶符號型的(signed)和無符號型的(unsigned)。
型別預設
char
編譯器決定
short
signed
intsigned
long
signed
long long
signed
字面值分為:整型字面值,浮點型字面值,字元字面值,字串字面值,布林字面值和指標字面值。
整數字面值分為十進位制,八進位制和十六進製制。
整數字面值預設值十進位制;如果以0開頭,則為十進位制;如果以0x或0x開頭,則為十六進製制。
十進位制型別預設是帶符號整數,在int、long和long long中選擇乙個尺寸最小的。
八進位制和十六進製制在int、unsigned int,long,unsigned long,long long和unsigned long long中選擇乙個尺寸最小的。
如果字面值過大,以至於最大尺寸的資料型別都放不下,則會報錯。
《c++ primer》對整型字面值有乙個奇葩的解釋:嚴格來說十進位製字面值不會是負數,如果我們使用了乙個形如-42的負十進位製字面值,那個負號並不在字面值之內,它的作用僅僅是對字面值取負值而已。
上述的解釋看似比較奇怪,但是深入思考之後,還是有點道理。與其將負號作為整型字面量的一部分,不如將其作為乙個運算子。
浮點型表現為乙個小數或以科學計數法表示的指數,其中指數部分用e或e標識。
舉例:3.14159|3.14159e0|0.|0e0 .001
預設浮點型字面值是乙個double。
用單引號括起來的乙個字元稱為char型字面值。
順便在這裡介紹一下轉義序列。
通常我們用轉義序列來表示不可列印的字元和有特殊含義的字元。
字元轉義序列
換行符\n
縱向製表符
\v反斜線
\\回車符
\r橫向製表符
\t退格符
\b問號
\?進紙符
\f報警(響鈴)符
\a雙引號
\"單引號\'
也可以用泛化的轉義序列來表示其他字元,其形式是\x(注意不要用\x)後緊跟1個或多個十六進製制數字,或者\後緊跟1個、2個或3個八進位制數字,其數值部分表示的是字元對應的數值。
雙引號括起來的零個或多個字元則構成字串型字面量。
字串字面量的型別實際上是有常量字元構成的陣列(array)。編譯器會在每個字串的結尾處新增乙個空字元(』\0』),因此,字串字面量值的實際長度要比它的內容多1。
很重要的一點:如果兩個字串字面量位置緊鄰且僅有空格、縮排和換行符分隔,則它實際上是乙個整體。請看下面示例。
std::cout <<
"a really, really long string literal "
"that spans two lines"
<< std::endl;
布林字面值只有兩個:true和false。
常見的指標字面值為nullptr,表示空指標,可以轉化成任意其他的指標型別。也可以通過0或null來初始化空指標,其中null是標頭檔案cstdlib中定義的預處理變數。
除了預設字面值型別之外,還可以強行指定字面值型別。
字面量型別
字尾或字尾
型別字元字面值
u(字首)
char16_t
u(字首)
char32_t
l(字首)
wchar_t
字串字面值
u(字首)
char16_t
u(字首)
char32_t
l(字首)
wchar_t
u8(字首)
char
整型字面值
u or u(字尾)
unsigned
l or l(字尾)
long
ll or ll(字尾)
long long
浮點型字面值
f or f(字尾)
float
l or l(字尾)
long double
由於型別轉化涉及的內容比較多,這裡不做過多的介紹,之後會用一章詳細介紹型別轉換。
用非布林型別賦給布林型別時,初始值為0則結果為false,否則結果為true。
用布林型別賦給非布林型別時,初始值為false則結果為0,否則結果為1。
用浮點型別賦給整數型別時,僅保留小數點之前的部分。
用整數型別賦給浮點型別是,小數部分記為0,如果整數所佔的空間超過了浮點型別的容量,則精度可能有損失。
當無符號型別超出範圍時,其結果是初始值對無符號型別表示數值總數取模後所得的餘數。
當帶符號型別超出範圍時,其結果是未定義的。
帶符號型別會自動轉化為無符號型別。
[1] stanley b. lippman. c++ primer[m]. 電子工業出版社, 2013.
C 中字面值常量和字面值型別
乙個形如42的值被稱為字面值常量。字面值常量的形式和值決定了常量的型別。例如0x42是16進製表示的整型常量。a 是char型字面值。字面值常量顧名思義由字面意思表示,是常量。字面值常量在程式中是直接表示的,整型直接寫出大小,字元直接寫出字元。乙個字面值常量在編譯時被直接解析為立即數,編譯器內部維護...
C 中字面值常量和字面值型別
乙個形如42的值被稱為字面值常量。字面值常量的形式和值決定了常量的型別。例如0x42是16進製表示的整型常量。a 是char型字面值。字面值常量顧名思義由字面意思表示,是常量。字面值常量在程式中是直接表示的,整型直接寫出大小,字元直接寫出字元。乙個字面值常量在編譯時被直接解析為立即數,編譯器內部維護...
C語言的 強制型別轉換 以及 字元字面值
c語言的顯式 隱式型別轉換,都有乙個中間變數的存在,原資料的型別 內容都不變。以下 都用gcc編譯。1 include2 3int main 4 之前以為單引號多字元,比如 123 會報錯,測試了一下才發現只會警告 gcc,裡給出警告資訊 能編譯通過 1 include 2 3int main 4 ...