C 基本內建型別 字面值以及常見型別轉換

2021-10-07 22:47:47 字數 3649 閱讀 9401

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;

布林字面值只有兩個:truefalse

常見的指標字面值為nullptr,表示空指標,可以轉化成任意其他的指標型別。也可以通過0null來初始化空指標,其中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 ...