一蛛倦、基本內(nèi)置類型
C++定義的幾種基本的算術(shù)類型:int歌懒,char,float和bool溯壶。以及特殊的void類型及皂,void類型沒有對應(yīng)的值,通常用作無返回值函數(shù)的返回類型且改。
|類型 | 含義 | 最小存儲空間(位)|
|:---- |:-- -----|:-------------|
|bool | 布爾型 | - |
|char | 字符型 | 8|
|wchar_t | 寬字符型 |16|
|short | 短整型| 16|
|int | 整型 | 16|
|long | 長整型 | 32|
|float | 單精度浮點型 | 6位有效數(shù)字|
|double | 雙精度浮點型 | 10位有效數(shù)字|
|long double | 拓展精度浮點型 | 10位有效數(shù)字|
注:即使是c++標(biāo)準(zhǔn)規(guī)定了存儲標(biāo)準(zhǔn)验烧,但是并不能阻止編譯器使用更大的存儲空間。而且又跛,對于int型幾乎所有編譯器使用的空間都比所要求的大宪塔。
1甘畅、整型
表示整數(shù)瘦黑、<span style="color:red">字符</span>和布爾值的算術(shù)類型合稱為整型(integral type)竹伸。(沒錯,字符也是整型@窳摇)
1 word(字) = 4 byte(字節(jié)) = 32 bit(位)
- 字符類型有兩種:char和wchar_t弧满。char能夠保證存儲機(jī)器基本字符集中任何字符相應(yīng)的數(shù)值,因此char通常是單個機(jī)器字節(jié)(byte)此熬;wchar_t類型用于拓展字符集庭呜,如漢字和日語,這些字符集中的一些字符不能用單個char表示犀忱;
- short募谎、int和long都表示整型值。一般short為半個字(word)長峡碉,int為一個字長,而long為一個或兩個字長(32位機(jī)器中int和long通常字長相同)驮审;
- bool:true, false鲫寄〖矗可以將整型值賦給bool對象,0值表示false地来,非0值都代表true戳玫;
1.1、signed和unsigned
整型除了bool之外都可以帶符號(signed)也可以不帶符號(unsigned)未斑。
- signed(帶符號):能表示正數(shù)也可以表示負(fù)數(shù)(包括0)咕宿;
- unsigned(不帶符號):只能表示0及以上的數(shù);
int蜡秽,short和long默認(rèn)是帶符號型府阀,需要指定unsigned才能獲得無符號類型,其中unsigned int可以簡寫為unsigned芽突。
1.2试浙、整型值的表示
- unsigned類型的所有位均可表示數(shù)值。例如寞蚌,在機(jī)器中定義了一種類型使用8位表示田巴,則該類型的取值范圍是 0~255;
- signed類型在c++標(biāo)準(zhǔn)中并未定義如何用位來表示(我讀的《C++primer》版本是第4版)挟秤,由編譯器自由決定壹哺。8位的signed類型取值范圍至少是 -127~127,也有允許 -128~127.
1.3艘刚、整型的賦值
疑問:當(dāng)把一個超過其取值范圍的值賦給一個指定類型的對象時管宵,會發(fā)生什么?
- unsigned:編譯器必須調(diào)整越界值使其滿足要求昔脯,編譯器會將該值對該類型的可能取值數(shù)求模啄糙。
例如8位的unsigned char,取值范圍是 0~255云稚,則可能的取值數(shù)是 256隧饼。當(dāng)試圖把 336存儲到unsigned char中,實際存儲的是80静陈,因為 336%256 = 80燕雁。注:c++中把負(fù)值賦給unsigned對象是完全合法的
- signed:由編譯器決定,可能跟unsigned類似鲸拥,也可能采取其他方式拐格。
2、浮點型
- float(單精度浮點數(shù)):一個字長(32位)
- double(雙精度浮點數(shù)):兩個字長(64位)
- long double(拓展精度):三或四個字長(96位或128位)
二刑赶、字面值常量
像42這樣的值捏浊,在程序中被稱為字面值常量(literal constant)。
稱它為字面值是因為只能用它的值來稱呼它撞叨,稱為常量是因為它的值不能被修改金踪。
每個字面值都有相應(yīng)的類型浊洞,例如:0是int型;3.14159是double型胡岔。
只有內(nèi)置類型存在字面值法希,沒有類類型的字面值。因此靶瘸,標(biāo)準(zhǔn)庫類型沒有字面值苫亦。
2.1、整型字面值規(guī)則
整數(shù)常量可以使用下列三種進(jìn)制的任意一種:十進(jìn)制怨咪、八進(jìn)制和十六進(jìn)制屋剑。
例如值20的定義:
- decimal: 20
- octal: 024
- hexadecimal: 0x14
字面值整數(shù)常量的默認(rèn)類型為int或long。
這取決與字面值——值適合int就是int型惊暴,大于int就是long(即饼丘,假設(shè)int為1機(jī)器字長(32位),則 -2^31+1 ~ 2^31-1
為int辽话,大于 2^31-1
的為long)肄鸽。
通過加后綴可以把字面值類型轉(zhuǎn)換成long,unsigned或unsigned long油啤。
- long: 20L
- unsigned: 20U(20u)
- unsigned long: 20UL(20LU/20Lu/20uL)
注:定義long類型時典徘,推薦使用大寫字母 L ,因為用戶讀起來時益咬,小寫字母 l 很容易和數(shù)字 1 混淆逮诲!
2.2、浮點字面值規(guī)則
可以用十進(jìn)制或科學(xué)計數(shù)法表示浮點字面值常量幽告。
科學(xué)計數(shù)法指的是梅鹦,指數(shù)用 E 或 e 表示。
默認(rèn)的浮點字面值常量是double型冗锁。后綴加上 F 或 f 表示單精度齐唆,加上 L 或 l 表示拓展精度(<span style="color:red">不推薦使用小寫字母 l</span>)
下面每一列的字面值是表示相同的值:
3.14159F | .001f | 12.345L | 0. |
---|---|---|---|
3.14159E0f | 1E-3f | 1.2345E1L | 0e0 |
2.3、布爾字面值和字符字面值
bool的字面值: true和false冻河。
可打印的字符型字面常量通常用一對單引號來定義: 'a', '2', ',', ' '(空格)箍邮;
加上 L 可以得到 wchar_t 類型的寬字符字面值: L'a'。
2.4叨叙、非打印字符的轉(zhuǎn)義序列
\n | \r | \a | \b | \t | \v | \f | ? | " | ' | \ |
---|---|---|---|---|---|---|---|---|---|---|
換行符 | 回車符 | 報警符 | 退格符 | 水平制表符 | 縱向制表符 | 進(jìn)紙符 | 疑問號 | 雙引號 | 單引號 | 反斜杠 |
任何字符都可以通過 “\XXX” 的形式表示锭弊,“XXX”表示三位八進(jìn)制數(shù)字。下面是用ASCII碼表示字面常量:
- \7 : 報警符
- \0 : 空格符
- \12: 換行符
- \40: 空格符
- \115: 'M'
- \062: '2'
2.5擂错、字符串字面值
前面的均是基本內(nèi)置類型味滞,下面的 字符串字面值 會更復(fù)雜一些,后續(xù)會詳細(xì)說明。
字符串字面值常量是 雙引號括起來的零個或多個字符剑鞍,不可打印的字符使用相應(yīng)的轉(zhuǎn)義字符刹悴。
- "Hello World!"
- ""
- "\nHello\tWorld!\n"
注:為了兼容C語言,C++會在所有字符串字面值常量末尾添加一個空字符
如 'A' 表示 單個字符 A攒暇,而 "A" 表示字符 A 和一個空字符兩個字符的字符串
2.6、字符串字面值的連接
std::cout << "Hello"
" "
"World" "!"
<< std::endl;
等價于
std::cout << "Hello World!" <<std::endl;
但是下面試圖連接 字符串字面值和寬字符串字面值 是非法的
std::cout << "Hello" L" World!" <<std::endl;
2.7子房、多行字面值
std::cou\
t<< "Hello" << st\
d::endl;
等價于
std::cout << "Hello" << std::endl;
反斜杠 '' 必須是該行的結(jié)尾形用,不允許后面有空格或注釋。同樣的证杭,下一行的前面也不能有任何空格和制表符田度。
對于下一個 長字符串 例子,反斜杠后也不能有其他字符解愤;而后一行的前面所有空格或制表符都會成為 長字符串的一部分镇饺。
std::cout << "Hello \
World!" << std::endl;
END.