1. 整型數(shù)據(jù)類(lèi)型
C語(yǔ)言里面的整數(shù)數(shù)據(jù)類(lèi)型
類(lèi)型名稱(chēng) | C語(yǔ)言中的關(guān)鍵字 | 注釋 |
---|---|---|
字符型 | char | 表示一個(gè)很小的整數(shù) |
短整型 | short | 表示一個(gè)不怎么大的整數(shù) |
整型 | int | 生活中一般的整數(shù)都可以表示 |
長(zhǎng)整型 | long | 較大的整數(shù) |
加長(zhǎng)整型 | long long | 非常大的整數(shù) |
一個(gè)整數(shù)而已,為什么會(huì)需要定義這么多不同的類(lèi)型出來(lái)呢?
計(jì)算機(jī)通過(guò)晶體管的開(kāi)關(guān)狀態(tài)來(lái)記錄數(shù)據(jù)。它們通常8個(gè)編為一組,我們稱(chēng)之為 字節(jié) 。而晶體管有開(kāi)關(guān)兩種狀態(tài),一個(gè)字節(jié)有8個(gè)晶體管,因此一個(gè)字節(jié)可以擁有2的八次方個(gè)不同的狀態(tài)。讓每一種狀態(tài)對(duì)應(yīng)一個(gè)數(shù)值,這樣一個(gè)字節(jié)可以表示256個(gè)不同數(shù)值。
晶體管狀態(tài) | 二進(jìn)制數(shù)值 | 十進(jìn)制數(shù)值 |
---|---|---|
關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)關(guān) | 00000000 | 0 |
關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)開(kāi) | 00000001 | 1 |
關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)開(kāi)關(guān) | 00000010 | 2 |
關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)開(kāi)開(kāi) | 00000011 | 3 |
… | … | … |
開(kāi)關(guān)開(kāi)關(guān)開(kāi)關(guān)開(kāi)關(guān) | 10101010 | 170 |
開(kāi)開(kāi)開(kāi)開(kāi)開(kāi)開(kāi)開(kāi)開(kāi) | 11111111 | 255 |
要表示更大的數(shù)據(jù)范圍就需要更多晶體管。要知道在發(fā)明C語(yǔ)言的年代,計(jì)算機(jī)存儲(chǔ)資源是非常珍貴而稀缺的。如果只想表達(dá)0到100以?xún)?nèi)的數(shù)值,那么一個(gè)字節(jié)就足夠了,何必用兩個(gè)字節(jié)來(lái)存儲(chǔ)?
而如今,即使存儲(chǔ)資源已經(jīng)較為豐富了,但是大部分的強(qiáng)類(lèi)型語(yǔ)言,都延續(xù)了這個(gè)傳統(tǒng)。它們均提供了豐富的類(lèi)型以供選用。而程序員在編寫(xiě)代碼時(shí),通常能預(yù)想到需要使用到的數(shù)據(jù)范圍的大小。這樣在處理一個(gè)數(shù)據(jù)時(shí),可以從語(yǔ)言所提供的類(lèi)型中選用最合適的類(lèi)型來(lái)承載數(shù)據(jù)。
在C語(yǔ)言標(biāo)準(zhǔn)并未規(guī)定這些數(shù)據(jù)類(lèi)型的大小范圍,具體的實(shí)現(xiàn)交由了編譯器和平臺(tái)決定。
2. 用sizeof關(guān)鍵詞來(lái)測(cè)量大小
和int
一樣,sizeof
是C語(yǔ)言中的一個(gè)關(guān)鍵詞。它是英文size of
連起來(lái)的合成詞。翻譯成中文就是什么東西的大小的意思。它能夠測(cè)量C語(yǔ)言各種實(shí)體所占用的字節(jié)大小。
如果我們想看int
所占用的字節(jié)大小,可以這樣寫(xiě)sizeof(int)
。執(zhí)行后這段代碼后,它的測(cè)量結(jié)果是一個(gè)整型。我們可以借助printf
函數(shù)將測(cè)量結(jié)果顯示在控制臺(tái)上。我們現(xiàn)在可以假設(shè)sizeof
返回的結(jié)果是int
類(lèi)型的,在printf
函數(shù)中使用占位符%d
。而更準(zhǔn)確的用法,應(yīng)該用%zu
。
測(cè)量int
類(lèi)型所占用的字節(jié)大小,并將結(jié)果打印在控制臺(tái)上的代碼如下:
printf("%dn", sizeof(int));
sizeof
后面既可以跟 類(lèi)型,也可以跟 變量、常量。
- 跟 類(lèi)型 ,測(cè)類(lèi)型所占用字節(jié)的大小。
- 跟 變量 ,測(cè)變量的類(lèi)型所占用字節(jié)大小。
- 跟 常量 ,測(cè)常量的類(lèi)型所占用字節(jié)大小。
三種情況的示例代碼。
int a; printf("sizeof int = %dn", sizeof(int)); // 1.測(cè)類(lèi)型所占用字節(jié)的大小 printf("sizeof a = %dn", sizeof(a)); // 1.測(cè)變量的類(lèi)型所占用字節(jié)大小 printf("sizeof 123 = %dn", sizeof(123)); // 1.測(cè)常量的類(lèi)型所占用字節(jié)大小
測(cè)試C語(yǔ)言提供的各種整型類(lèi)型的大小
printf("sizeof char=%dn", sizeof(char)); printf("sizeof short=%dn", sizeof(short)); printf("sizeof int=%dn", sizeof(int)); printf("sizeof long=%dn", sizeof(long)); printf("sizeof long long=%dn", sizeof(longlong));
結(jié)果:char,short,int,long,long long分別占用了1,2,4,4,8個(gè)字節(jié)。至此,我們已經(jīng)得知了它們所占字節(jié)大小,并且驗(yàn)證了可以表示越大范圍的數(shù)據(jù)類(lèi)型所占用的字節(jié)越多。值得注意的是
int
和long
均占用4個(gè)字節(jié)。這并未違反C語(yǔ)言標(biāo)準(zhǔn),C語(yǔ)言標(biāo)準(zhǔn)規(guī)定高級(jí)別的類(lèi)型取值范圍不得小于低級(jí)別的類(lèi)型,但是它們可以是一致的。
3. 三位二進(jìn)制表示的數(shù)值范圍
char
,short
,int
,long
,long long
分別占用了1,2,4,4,8個(gè)字節(jié)。而每個(gè)字節(jié)由8個(gè)晶體管組成,每個(gè)晶體管狀態(tài)我們稱(chēng)之為位。那么char
,short
,int
,long
,long long
分別占用了8,16,32,32,64位。
太多的位不利于理解原理,暫時(shí)把問(wèn)題簡(jiǎn)化一下,試試看位數(shù)減少到3。然后,分析3位的組 合,它能表示多大范圍的數(shù)值.
晶體管狀態(tài) | 二進(jìn)制數(shù)據(jù) | 十進(jìn)制數(shù)據(jù) |
---|---|---|
關(guān)關(guān)關(guān) | 000 | 0 |
關(guān)關(guān)開(kāi) | 001 | 1 |
關(guān)開(kāi)關(guān) | 010 | 2 |
關(guān)開(kāi)開(kāi) | 011 | 3 |
開(kāi)關(guān)關(guān) | 100 | 4 |
開(kāi)關(guān)開(kāi) | 101 | 5 |
開(kāi)開(kāi)關(guān) | 110 | 6 |
開(kāi)開(kāi)開(kāi) | 111 | 7 |
三位二進(jìn)制組成的數(shù)據(jù)類(lèi)型,可以表達(dá)2的3次方也就是8個(gè)數(shù)值。如果從0開(kāi)始,那么可以表達(dá)從0到7的 數(shù)據(jù)范圍。 得出結(jié)論 :如果不考慮負(fù)數(shù),那么整型數(shù)據(jù)類(lèi)型可以表達(dá)的數(shù)據(jù)范圍是 假設(shè),位數(shù)為n,則數(shù)據(jù)范圍從【0】開(kāi)始,到【2的n次方-1】的數(shù)值范圍。
那負(fù)數(shù)
怎么辦?我們需要 拿出一個(gè)位來(lái)作為符號(hào)位 。用來(lái)表示這個(gè)數(shù)據(jù)是正數(shù)還是負(fù)數(shù)。在IEEE標(biāo)準(zhǔn)中,這個(gè)符號(hào)位存在于二進(jìn)制的最高位。用三位二進(jìn)制來(lái)示范這種情況。
晶體管狀態(tài) | 二進(jìn)制數(shù)據(jù) | 十進(jìn)制數(shù)據(jù) |
---|---|---|
關(guān)關(guān)關(guān) | 000 | 0 |
關(guān)關(guān)開(kāi) | 001 | 1 |
關(guān)開(kāi)關(guān) | 010 | 2 |
關(guān)開(kāi)開(kāi) | 011 | 3 |
開(kāi)關(guān)關(guān) | 100 | -4 |
開(kāi)關(guān)開(kāi) | 101 | -3 |
開(kāi)開(kāi)關(guān) | 110 | -2 |
開(kāi)開(kāi)開(kāi) | 111 | -1 |
加上符號(hào)之后,現(xiàn)在取值范圍變?yōu)樨?fù)4到3了。紅色字體的為最高位,最高位為1的表示負(fù)數(shù)。你可能會(huì)覺(jué)得有點(diǎn)奇怪,為什么3的二進(jìn)制是011
,而負(fù)3卻是101
呢?如果簡(jiǎn)單的加一個(gè)符號(hào)位,為什么不用111呢?那我們看看如圖中所示的3與負(fù)3相加的運(yùn)算結(jié)果。
會(huì)驚奇地發(fā)現(xiàn),用101來(lái)表示負(fù)3與用011表示的正3相加。結(jié)果為1000,但是由于僅有3位二進(jìn)制來(lái)保 存數(shù)據(jù),最高位1被丟棄了。結(jié)果為000,居然得到了正確的結(jié)果0。
4.數(shù)值的補(bǔ)碼表示法
時(shí)鐘是一個(gè)圓被分成了12個(gè)點(diǎn),讓我們假設(shè)這個(gè)時(shí)鐘一步只能走一個(gè)整點(diǎn)。那么這個(gè)時(shí)鐘只有12種不同的模式,我們把12稱(chēng)之為時(shí)鐘的模。
現(xiàn)在指針指向了5點(diǎn),我們要讓指針回到0點(diǎn)。一個(gè)辦法是直接回退5個(gè)小時(shí)(5-5)。另一個(gè)辦法是繼續(xù)往前走7個(gè)小時(shí)(5+7)。
在第二種辦法中,5+7=12,而12剛好為時(shí)鐘的模,時(shí)鐘指向12的同時(shí),也正好指向了0。要讓指針回到0點(diǎn),只需要讓它加上模與當(dāng)前的時(shí)間的差即可。
因此,指針回退5小時(shí)與指針前進(jìn)7小時(shí)是等價(jià)的。我們可以用指針前進(jìn)來(lái)代替指針后退。
將這種思想帶入到上面討論的三位二進(jìn)制當(dāng)中。三位二進(jìn)制能表示8中不同的模式,因此它的 模 為8。要讓3回到0,我們可以讓3減去3,也可以讓3加上 模與3的差,即8-3=5。因此,我們可以把-3在三位二進(jìn)制中用5的二進(jìn)制101表示。
這種將用加法來(lái)等效減法的二進(jìn)制表示法被稱(chēng)之為補(bǔ)碼表示法。
正數(shù)的補(bǔ)碼就是其二進(jìn)制本身。而正數(shù)對(duì)應(yīng)的負(fù)數(shù)的補(bǔ)碼為:(模 - 正數(shù))的二進(jìn)制。
000 | 0 | |||
---|---|---|---|---|
001 | 1 | |||
010 | 2 | |||
負(fù)數(shù) | 模減去正數(shù) | 補(bǔ)碼 | 011 | 3 |
-4 | 8-4=4 | 100 | 100 | -4 |
-3 | 8-3=5 | 101 | 101 | -3 |
-2 | 8-2=6 | 110 | 110 | -2 |
-1 | 8-1=7 | 111 | 111 | -1 |
補(bǔ)碼表示法既通過(guò)最高位,區(qū)別了正數(shù)和負(fù)數(shù)。并且,巧妙地應(yīng)用了溢出,所得到的計(jì)算結(jié)果也是正確的。類(lèi)似于鐘表僅需要向前走就可以實(shí)現(xiàn)減法,計(jì)算機(jī)的電路設(shè)計(jì)中,也只需要設(shè)計(jì)加法電路。極大地簡(jiǎn)化了計(jì)算機(jī)內(nèi)部電路的復(fù)雜程度。
求一個(gè)正數(shù)對(duì)應(yīng)的負(fù)數(shù)的補(bǔ)碼的第二種辦法:
- 先寫(xiě)出這個(gè)正數(shù)的二進(jìn)制。
- 從二進(jìn)制的右邊開(kāi)始,遇到第一個(gè)1之前,全都填0。
- 遇到第一個(gè)1之后,把1填下來(lái)。
- 1之后的全部取反。
從右往左:未遇到1填0,遇到1填1,然后全部取反
十進(jìn)制 0 -1 -2 -3 -4 整數(shù)二進(jìn)制 000 001 010 011 100 補(bǔ)碼 000 111 110 101 100
5.各種整型類(lèi)型的數(shù)值范圍是多少
類(lèi)型 | sizeof大小 | 二進(jìn)制位數(shù) | 取值范圍算式 | 取值范圍 |
---|---|---|---|---|
char | 1 | 1×8 = 8位 | -[2的7次方] ~ +[2的七次方 - 1] | -128 ~ +127 |
short | 2 | 2×8 = 16位 | -[2的15次方] ~ +[2的15次方 - 1] | -32,768 ~ +32,767 |
int | 4 | 4×8 = 32位 | -[2的31次方] ~ +[2的31次方 - 1] | -2,147,483,648 ~ +2,147,483,647 |
long | 4 | 4×8 = 32位 | -[2的31次方] ~ +[2的31次方 - 1] | -2,147,483,648 ~ +2,147,483,647 |
long long | 8 | 8×8 = 64位 | -[2的63次方] ~ +[2的63次方 - 1] | -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 |
次方數(shù)比位數(shù)少一,是因?yàn)樽罡呶槐挥萌プ龇?hào)位了。
6. 無(wú)符號(hào)整型
如果你確定你不會(huì)用到負(fù)數(shù),那么請(qǐng)使用unsigned
關(guān)鍵詞。表明這個(gè)數(shù)據(jù)類(lèi)型,是不帶有符號(hào)位的。既然不帶有符號(hào)位了,那么原本留給符號(hào)位的那一個(gè)二進(jìn)制位,可以用來(lái)表示數(shù)值。
類(lèi)型 | sizeof大小 | 二進(jìn)制位數(shù) | 取值訪(fǎng)問(wèn)算式 | 取值范圍 |
---|---|---|---|---|
unsigned char | 1 | 1×8 = 8位 | 0 ~ +[2的8次方 - 1] | 0 ~ +255 |
unsigned short | 2 | 2×8 = 16位 | 0 ~ +[2的16次方 - 1] | 0 ~ +65,535 |
unsigned int | 4 | 4×8 = 32位 | 0 ~ +[2的32次方 - 1] | 0 ~ +4,294,967,295 |
unsigned long | 4 | 4×8 = 32位 | 0 ~ +[2的32次方 - 1] | 0 ~ +4,294,967,295 |
unsigned long long | 8 | 8×8 = 64位 | 0 ~ +[2的64次方 - 1] | 0 ~ +18,446,744,073,709,551,615 |
-
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4226瀏覽量
85575 -
晶體管
+關(guān)注
關(guān)注
77文章
9609瀏覽量
137655 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135858 -
數(shù)據(jù)類(lèi)型
+關(guān)注
關(guān)注
0文章
236瀏覽量
13596 -
整數(shù)
+關(guān)注
關(guān)注
0文章
13瀏覽量
6486
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論