C 語言基礎(chǔ)教程(我的C之旅開始了)[四]
10. 基本數(shù)據(jù)類型:整型(上)
1. 整型 int C 語言提供了很多整數(shù)類型(整型),這些整型的區(qū)別在于它們的取值范圍的大小,以及是否可以為負(fù)。int 是整型之一,一般被稱為整型。 正如我們?cè)谝郧暗慕坛汤锟吹降哪菢樱琲nt 用于聲明整型變量:以 int 打頭,后面跟著變量的名字,最后以分號(hào)(;)結(jié)束。例如: int erns; /* 聲明一個(gè)變量 */ 以上聲明創(chuàng)建了變量,但是沒有給它們提供“值(value)”。在前面的教程中,我們已經(jīng)用了兩種方法使變量獲得“值”。一種是賦值:cows = 500; 。另一種是使用 scanf 函數(shù):scanf( "%d", &goats ); 。下面我們來學(xué)習(xí)第三種方法。 初始化變量是指給變量賦初值:聲明變量的時(shí)候,在變量名的后面寫上等號(hào)(=),然后寫下你希望賦予變量的“值”。例如: int hogs = 21; 以上聲明創(chuàng)建了變量,并且為這些變量分配了空間,同時(shí)也賦了初值。注意,第三行中只有 cats 被初始化為 94,而 dogs 沒有被初始化!如下圖: 上面的例子中,21、32、14,以及 94 都是整數(shù)常量。C 語言中,整數(shù)常量的默認(rèn)類型是 int ,也就是說,整數(shù)常量占用內(nèi)存空間的大小一般等于 int 類型的變量占用空間的大小。如果整數(shù)常量的大小超過了 int 的取值范圍,那么編譯器將會(huì)把這個(gè)整數(shù)常量當(dāng)作 long int 類型來處理,這個(gè)我們后面還會(huì)講到。 int year = 2005; /* year 是 int 型變量 */ 保證格式限定符的數(shù)目和參數(shù)數(shù)目一致是我們的責(zé)任,編譯器不負(fù)責(zé)捕捉這種錯(cuò)誤!例如: #include <stdio.h> int main(void) printf("%d minus %d is %d\n", ten ); /* 少寫了兩個(gè)參數(shù) */ getchar(); /* 等待用戶按回車 */ 這個(gè)程序可以通過編譯,但是運(yùn)行結(jié)果將會(huì)出乎意料,因?yàn)槲覀兩賹懥藘蓚€(gè)參數(shù)。第一個(gè) %d 被參數(shù) ten 的值代替,而另外兩個(gè) %d 將被內(nèi)存中本來儲(chǔ)存著的值代替。因?yàn)閮?nèi)存中本來儲(chǔ)存著的值是不確定的,所以輸出結(jié)果是不確定的。 C 語言中,整數(shù)常量默認(rèn)是十進(jìn)制(decimal)整數(shù)。通過在整數(shù)常量前面加上特定的前綴,可以把它設(shè)定為八進(jìn)制或者十六進(jìn)制整數(shù)。前綴 0x 或者 0X 把整數(shù)常量設(shè)定為十六進(jìn)制整數(shù)。注意,是數(shù)字 0 ,而不是字母 O ,別搞錯(cuò)了哦!例如:十進(jìn)制的 16 用十六進(jìn)制來表示是 0x10 或者 0X10 。在整數(shù)常量前面加上前綴 0 ,表示它是八進(jìn)制整數(shù)。注意,是數(shù)字 0 ,而不是字母 O 。例如:十進(jìn)制的 16 表示為八進(jìn)制就是 020 。 使用格式限定符 %o 可以以八進(jìn)制的形式輸出整數(shù)。注意,是小寫字母 o ,不是數(shù)字 0 。使用 %x 或者 %X 可以以十六進(jìn)制的形式輸出整數(shù)。小寫 x 表示輸出使用小寫字母,大寫 X 表示輸出使用大寫字母。使用 %#o,%#x 或者 %#X,得到的輸出將包括前綴 0,0x 或者 0X。例如: #include <stdio.h> int main(void) printf("dec = %d; octal = %o; hex = %x; HEX = %X\n", x, x, x, x); getchar(); 這個(gè)程序的輸出是: dec = 200; octal = 310; hex = c8; HEX = C8 1. 其它整數(shù)類型 int 是 C 語言的基本整數(shù)類型,可以滿足我們處理一般數(shù)據(jù)的需求。C 語言還提供了四個(gè)可以修飾int的關(guān)鍵字:short、long、signed,以及unsigned。利用這四個(gè)關(guān)鍵字,C 語言標(biāo)準(zhǔn)定義了以下整數(shù)類型: 1) short int(可簡寫為 short),和 int 一樣,也是有符號(hào)整數(shù) 一般我們把 short 稱為短整型,把 long 稱為長整型,把 long long 稱為超長整型,把 int 稱為整型。unsigned 打頭的那些整數(shù)類型統(tǒng)稱為無符號(hào)整型。例如:我們稱 unsigned short 為無符號(hào)短整型。以此類推。 這些整數(shù)類型的聲明方式與 int 類型的聲明方式一樣。例如: long int estine; 如果您的編譯器不支持C99標(biāo)準(zhǔn),那就不能使用long long和unsigned long long。 標(biāo)準(zhǔn)也規(guī)定了這些整數(shù)類型的最小取值范圍。short 的最小表示范圍和 int 一樣,都是 -32767 到 32767 。也就是 -(2^15 - 1)到(2^15 - 1)。其中,2^15表示 2 的 15 次方。類似地,2 的 20 次方記作 2^20 ,以此類推。注意:C 語言中 2^15 并不表示 2 的 15 次方,為了書寫方便,我們姑且這么表示。long 的最小取值范圍是 -2147483647 到 2147483647 。也就是 -(2^31 - 1) 到 printf( "%lu\n", (unsigned long)sizeof(int) * 8 ); /* 輸出 int 的位數(shù) */ sizeof 的用法我們以后會(huì)講到,現(xiàn)在只要有個(gè)印象就好了。第二句中的 %zu 是 C99 特有的,如果您的編譯器不支持 C99(準(zhǔn)確地說,應(yīng)該是如果您的編譯器使用的庫函數(shù)不支持 C99),運(yùn)行結(jié)果將會(huì)出錯(cuò)。 如果您要處理的只是正整數(shù),那么應(yīng)該優(yōu)先使用 unsigned 打頭的那些整數(shù)類型。如果您要處理的整數(shù)超出了int所能表示的范圍,并且您的編譯器中,long的表示范圍比 int 大,那就使用 long 。不過,若非必要,盡量不要用 long ,因?yàn)樗赡軙?huì)降低程序運(yùn)行效率。有一點(diǎn)要注意:如果您的編譯器中,long和int都是32位的,并且您需要使用32位整數(shù),那么應(yīng)該用long,而不要用int。只有這樣,我們的程序才可以安全地移植到16位的計(jì)算機(jī),因?yàn)?16位的計(jì)算機(jī)中,int 一般也是16位的。類似地,如果您需要使用64位整數(shù),那就用 long long。如果 int 是 32 位的話,那么使用 short 可以節(jié)省空間,不過您得確保您要處理的整數(shù)不會(huì)超出 short 的表示范圍。這種“節(jié)省”對(duì)內(nèi)存大的計(jì)算機(jī)來說,是沒什么意義的。 5. long 型常量和 long long 型常量 一般來說,整數(shù)常量是被當(dāng)作 int 類型來存儲(chǔ)的。如果我們使用的整數(shù)常量超出了 int 的表示范圍,C 語言規(guī)定編譯器自動(dòng)使用 unsigned int 來處理這個(gè)常量。如果 unsigned也不足以表示這個(gè)常量的話,編譯器就會(huì)用long 。如果還表示不了的話,那就依次用unsigned long,long long,unsigned long long。如果unsigned long long也表示不了,那么編譯器就沒轍了。注意:long long 和unsigned long long 是 C99 特有的。例如:如果 int 是 16 位的話,它就表示不了常量 1000000。編譯器會(huì)使用 long 來處理這個(gè)常量,因?yàn)?unsigned int 也表示不了 1000000 。
int 代表有符號(hào)整數(shù),也就是說,用 int 聲明的變量可以是正數(shù),可以是負(fù)數(shù),也可以是零,但是只能是整數(shù)。標(biāo)準(zhǔn)規(guī)定 int 的最小取值范圍是 -32767 到 32767。int 的取值范圍因機(jī)器而異,但是一定要大于或者等于-32767到 32767。一般來說,int 占用一個(gè)字的內(nèi)存空間。因此,字長為 16 位的舊式 IBM 兼容機(jī)使用 16 位來儲(chǔ)存整型 int ,取值范圍是 -32768 到 32767 。目前的個(gè)人電腦一般都是 32 位字長的,這些電腦中,int一般也是32位的,取值范圍是 -2147483648到 2147483647 。對(duì)于使用 64 位 CPU 的電腦,使用更多字節(jié)儲(chǔ)存 int 也是很自然的事情,取值范圍當(dāng)然也會(huì)更大。
2. 聲明 int 類型的變量
/* 注意:一定要用逗號(hào)(,),不能用分號(hào)(;)*/
int hogs, cows, goats; /* 聲明三個(gè)變量 */
3. 初始化變量
int cows = 32, goats = 14;
int dogs, cats = 94;
4. int 常量
21、32、14 和 94 都在 int 的取值范圍之內(nèi),因此它們都是 int 常量。
5. 輸出 int 型數(shù)據(jù)
我們可以用 printf 函數(shù)來輸出 int 型數(shù)據(jù)。正如我們?cè)谇懊娴慕坛讨锌吹降哪菢?,占位?%d 代表輸出的是 int 型數(shù)據(jù),它告訴 printf 函數(shù)在什么地方輸出相應(yīng)的 int 型數(shù)據(jù)。%d 也被稱為格式限定符(format specifier),因?yàn)樗付?printf 函數(shù)應(yīng)該使用什么形式來輸出數(shù)據(jù)。printf 函數(shù)的第一個(gè)參數(shù)只能是字符串,這個(gè)字符串被稱為格式串(format string)。格式串中有多少個(gè) %d,我們就應(yīng)該相應(yīng)地提供多少個(gè) int 型參數(shù)給 printf 函數(shù)。int 型參數(shù)可以是 int 型變量,int 型常量,以及結(jié)果為 int 型的表達(dá)式等。例如:
printf( "Today is %d-%d-%d\n", year, 9, 20 + 9 ); /* 20 + 9 是加法表達(dá)式 */
{
int ten = 10, two = 2;
return 0;
}
6. 八進(jìn)制(octal)和十六進(jìn)制(hexadecimal)
7. 以八進(jìn)制或者十六進(jìn)制形式輸出數(shù)據(jù)
{
int x = 200;
printf("dec = %d; octal = %#o; hex = %#x; HEX = %#X\n", x, x, x, x);
return 0;
}
dec = 200; octal = 0310; hex = 0xc8; HEX = 0XC8
11. 基本數(shù)據(jù)類型:整型(中)
2) long int(簡寫:long),有符號(hào)整數(shù)
3) long long int(簡寫:long long),C99 標(biāo)準(zhǔn)添加的類型,
有符號(hào)整數(shù)
4) unsigned int(簡寫:unsigned),無符號(hào)整數(shù),不能表示負(fù)數(shù)
5) unsigned long int(簡寫:unsigned long),無符號(hào)整數(shù),
不能表示負(fù)數(shù)
6) unsigned short int(簡寫:unsigned short),無符號(hào)整數(shù),
不能表示負(fù)數(shù)
7) unsigned long long int(簡寫:unsigned long long),
C99 添加的類型,無符號(hào)整數(shù)
8) 所有沒有標(biāo)明 unsigned 的整數(shù)類型默認(rèn)都是有符號(hào)整數(shù)。
在這些整數(shù)類型前面加上 signed 可以使讀者更清楚地知道
這些是有符號(hào)整數(shù),盡管有沒有 signed 都表示有符號(hào)整數(shù)。
例如:signed int 等同于 int 。
2. 聲明方式
long johns;
short int erns;
short ribs;
unsigned int s_count;
unsigned players;
unsigned long headcount;
unsigned short yesvotes;
long long ago; /* C99 特有 */
unsigned long long ego; /* C99 特有 */
3. 取值范圍(表示范圍)
(2^31 - 1) 。unsigned short的最小表示范圍和unsigned int 一樣,都是 0 到 65535(2^16 - 1)。unsigned long 的最小取值范圍是 0 到 4294967295(2^32 - 1)。long long的最小取值范圍是 -9223372036854775807(-(2^63 - 1))到 9223372036854775807(2^63 - 1);unsigned long long 是 0 到
18446744073709551615(2^64 - 1)。
標(biāo)準(zhǔn)規(guī)定,int 的表示范圍不能小于 short 的表示范圍,long 的表示范圍不能小于 int 的表示范圍。這就是說 short 型變量占用的空間可能比 int 型變量少,而 long 型變量占用的空間可能比 int 型變量多。16 位(bit)的計(jì)算機(jī)中,int 和 short 一般都是 16 位,而 long 是 32位;32位的計(jì)算機(jī)中,short一般是 16 位,而long和int是 32位。TC2(16位的編譯器)中,int是16位的;而 Dev-C++(32 位的編譯器)中,int 是 32 位的。
使用 unsigned int 聲明的變量只能表示正整數(shù)。如果 int 是 16 位的話,那么 unsigned int 的表示范圍是 0 到65535(2^16 - 1)。這是因?yàn)閡nsigned 不需要符號(hào)位,可以把 16 個(gè)位全都用于表示整數(shù)。而 int 需要一個(gè)位作為符號(hào)位,用于表示正負(fù),只有 15 個(gè)位用于表示整數(shù)。
目前,long long 一般 64 位,long 是 32 位,short 是 16 位,而 int 或者 16 位,或者 32 位。具體某個(gè)編譯器到底使用多少位來表示這些類型,我們可以用運(yùn)算符 sizeof 來獲取。例如:
printf( "%zu\n", sizeof(short) * 8 ); /* 輸出 short 的位數(shù) */
4. 整數(shù)類型的選擇
同樣,十六進(jìn)制和八進(jìn)制整數(shù)常量通常也是被作為 int 來處理。但是,當(dāng)我們使用的常量超出了int的表示范圍后,編譯器會(huì)依次使用unsigned int,long,unsigned long,long long 和 unsigned long long。直到所使用的類型足以表示那個(gè)常量為止。
有時(shí),我們使用的是較小的常量,但是我們希望這個(gè)常量被當(dāng)作 long 來處理,這就需要在這個(gè)常量后面加上后綴 l(小寫字母 l)或者 L(大寫字母 L)。我們應(yīng)該避免使用 l ,因?yàn)?l 容易和數(shù)字 1 混淆。例如:整數(shù)常量 7 是被作為 int 來處理的,但整數(shù)常量 7L(或者 7l)是被作為 long 來處理的。類似地,在整數(shù)常量后面加上后綴 ll 或者 LL ,這個(gè)常量就會(huì)被當(dāng)作 long long 來處理。例如:3LL 。如果想使用無符號(hào)整數(shù)常量的話,還要配合使用后綴 u 或者 U 。例如:2u,3U,4Lu,5ul,6LU,7LLU,8Ull,9uLL 。
這些后綴也可以用于十六進(jìn)制和八進(jìn)制整數(shù)常量。例如:020L,010LL,
0x30uL,0x40ull 。
相關(guān)文章
VSCode 配置C++開發(fā)環(huán)境的方法步驟
這篇文章主要介紹了VSCode 配置C++開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)串(堆分配存儲(chǔ)表示法)實(shí)例詳解
這篇文章主要介紹了C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)串(堆分配存儲(chǔ)表示法)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07C語言中結(jié)構(gòu)體(struct)的幾種初始化方法
相信大家都知道struct結(jié)構(gòu)體是C語言中非常重要的復(fù)合類型,初始化的方法很多,那么小編下面對(duì)這些方法進(jìn)行總結(jié),便于自己和大家以后查閱,有需要的可以參考借鑒。2016-08-08C++如何實(shí)現(xiàn)字符串的部分復(fù)制
這篇文章主要介紹了C++如何實(shí)現(xiàn)字符串的部分復(fù)制問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08C語言實(shí)現(xiàn)數(shù)獨(dú)輔助器(附源碼)
數(shù)獨(dú)是源自瑞士的一種數(shù)學(xué)游戲。是一種運(yùn)用紙、筆進(jìn)行演算的邏輯游戲。本文將利用C語言制作一個(gè)數(shù)獨(dú)輔助器,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01C++ boost::asio編程-同步TCP詳解及實(shí)例代碼
這篇文章主要介紹了C++ boost::asio編程-同步TCP詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11