C語言幾種整形型別的區別
今天寫了一道演算法題,碰到long int型別定義的變數,竟然不知道什麼意思。。。 查資料,總結分享如下:
int資料型別的位數為16位,short int資料型別的位數也是16位。而long int的位數為32位,可用來儲存比較大的整數。
short int 和 long int可以縮寫為short 和 long。
C語言中的整型資料型別int、short int 和 long int
名稱 | 全稱型別說明符 | 縮寫型別說明符 | 位數 | 範圍 |
---|---|---|---|---|
整型 | int | int | 16位 | -32768至+32767 |
無符號整型 | unsigned int | unsigned | 16位 0 至 65,535 | |
短整型 | short int | short | 16位 | -32768至+32767 |
無符號短整型 | unsigned short int | unsigned short | 16位 | 0 至 65,535 |
長整型 | long int | long | 32位 | -2,147,483,648 至 2,147,483,647 |
|無符號長整型 |unsigned long int | unsigned long | 32位 | 0至4,294,967,295|
整型變數的宣告方式:
int sum;
long int population;
unsigned int sum;
在一個語句中宣告多個屬於同一型別的變數:
int withd, height;
int 型別的變數初始化方式:
withd = 150; //前面已經宣告,在此進行初始化
int height = 60; //直接在一個語句中進行宣告和初始化
C語言中整型常量有三種不同的表示形式:
1、八進位制整型常量:在八進位制數值前面加字首“0”,其數碼取值為0~7。例如:054、0567、05421。 2、十六進位制整型常量:字首為“0X”或“0x“,其數碼取值為0~9、A~F 或 a~f。例如:0X3D、0XE0、0xfff等。 3、十進位制整型常量:既無字首也無後綴。例如:254、745、890等。 如將儲存為long型別,需要在數字序列最後附一個字母L 或 l 作為字尾。例如:245L、7850L、124l等
1. 其它整數型別
int 是 C 語言的基本整數型別,可以滿足我們處理一般資料的需求。C 語言還提供了四個可以修飾 int 的關鍵字:short、long、signed,以及 unsigned。利用這四個關鍵字,C 語言標準定義了以下整數型別:
1) short int(可簡寫為 short),和 int 一樣,也是有符號整數
2) long int(簡寫:long),有符號整數
3) long long int(簡寫:long long),C99 標準新增的型別,
有符號整數
4) unsigned int(簡寫:unsigned),無符號整數,不能表示負數
5) unsigned long int(簡寫:unsigned long),無符號整數,
不能表示負數
6) unsigned short int(簡寫:unsigned short),無符號整數,
不能表示負數
7) unsigned long long int(簡寫:unsigned long long),
C99 新增的型別,無符號整數
8) 所有沒有標明 unsigned 的整數型別預設都是有符號整數。
在這些整數型別前面加上 signed 可以使讀者更清楚地知道
這些是有符號整數,儘管有沒有 signed 都表示有符號整數。
例如:signed int 等同於 int 。
一般我們把 short 稱為短整型,把 long 稱為長整型,把 long long 稱為超長整型,把 int 稱為整型。unsigned 打頭的那些整數型別統稱為無符號整型。例如:我們稱 unsigned short 為無符號短整型。以此類推。
宣告方式
這些整數型別的宣告方式與 int 型別的宣告方式一樣。例如:
long int estine;
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 特有 */
如果您的編譯器不支援 C99 標準,那就不能使用 long long 和 unsigned long long。取值範圍(表示範圍)
標準也規定了這些整數型別的最小取值範圍。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) 到 (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)。
標準規定,int 的表示範圍不能小於 short 的表示範圍,long 的表示範圍不能小於 int 的表示範圍。這就是說 short 型變數佔用的空間可能比 int 型變數少,而 long 型變數佔用的空間可能比 int 型變數多。16 位(bit)的計算機中,int 和 short 一般都是 16 位,而 long 是 32位;32位的計算機中,short一般是 16 位,而long和int是 32位。TC2(16位的編譯器)中,int是16位的;而 Dev-C++(32 位的編譯器)中,int 是 32 位的。
使用 unsigned int 宣告的變數只能表示非負整數(0 和正整數)。如果 int 是 16 位的話,那麼 unsigned int 的表示範圍是 0 到 65535(2^16 - 1)。這是因為 unsigned 不需要符號位,可以把 16 個位全都用於表示整數。而 int 需要一個位作為符號位,用於表示正負,只有 15 個位用於表示整數。
目前,long long 一般 64 位,long 是 32 位,short 是 16 位,而 int 或者 16 位,或者 32 位。具體某個編譯器到底使用多少位來表示這些型別,我們可以用運算子 sizeof 來獲取。例如:
printf( “%lu\n”, (unsigned long)sizeof(int) * 8 ); /* 輸出 int 的位數 */
printf( “%zu\n”, sizeof(short) * 8 ); /* 輸出 short 的位數 */
sizeof 運算子返回其運算元佔用空間的大小,以位元組(Byte)為單位。注意,C 定義位元組的大小為 char 型別的大小。char 通常是 8 位(bit)的,當然也可以更大。這裡我們假設 char 是 8 位的。點選檢視 char 型別詳細介紹
sizeof 的用法我們以後會講到,現在只要有個印象就好了。第二句中的 %zu 是 C99 特有的,如果您的編譯器不支援 C99(準確地說,應該是如果您的編譯器使用的庫函式不支援 C99),執行結果將會出錯。整數型別的選擇
如果您要處理的只是非負整數,那麼應該優先使用 unsigned 打頭的那些整數型別。如果您要處理的整數超出了 int 所能表示的範圍,並且您的編譯器中,long 的表示範圍比 int 大,那就使用 long。不過,若非必要,儘量不要用 long,因為它可能會降低程式執行效率。有一點要注意:如果您的編譯器中,long 和 int 都是 32 位的,並且您需要使用 32 位整數,那麼應該用 long,而不要用 int。只有這樣,我們的程式才可以安全地移植到 16 位的計算機,因為 16 位的計算機中,int 一般也是 16 位的。類似地,如果您需要使用 64 位整數,那就用 long long。如果 int 是 32 位的話,那麼使用 short 可以節省空間,不過您得確保您要處理的整數不會超出 short 的表示範圍。這種“節省”對記憶體大的計算機來說,是沒什麼意義的。long 型常量和 long long 型常量
一般來說,整數常量是被當作 int 型別來儲存的。如果我們使用的整數常量超出了 int 的表示範圍,C 語言規定編譯器自動使用 unsigned int 來處理這個常量。如果 unsigned 也不足以表示這個常量的話,編譯器就會用 long。如果還表示不了的話,那就依次用 unsigned long,long long,unsigned long long。如果 unsigned long long 也表示不了,那麼編譯器就沒轍了。注意:long long 和 unsigned long long 是 C99 特有的。例如:如果 int 是 16 位的話,它就表示不了常量 1000000。編譯器會使用 long 來處理這個常量,因為 unsigned int 也表示不了 1000000 。
同樣,十六進位制和八進位制整數常量通常也是被作為 int 來處理。但是,當我們使用的常量超出了 int 的表示範圍後,編譯器會依次使用unsigned int,long,unsigned long,long long 和 unsigned long long。直到所使用的型別足以表示那個常量為止。
有時,我們使用的是較小的常量,但是我們希望這個常量被當作 long 來處理,這就需要在這個常量後面加上字尾 l(小寫字母 l)或者 L(大寫字母 L)。我們應該避免使用 l ,因為 l 容易和數字 1 混淆。例如:整數常量 7 是被作為 int 來處理的,但整數常量 7L(或者 7l)是被作為 long 來處理的。類似地,在整數常量後面加上字尾 ll 或者 LL ,這個常量就會被當作 long long 來處理。例如:3LL 。如果想使用無符號整數常量的話,還要配合使用字尾 u 或者 U 。例如:2u,3U,4Lu,5ul,6LU,7LLU,8Ull,9uLL 。
這些字尾也可以用於十六進位制和八進位制整數常量。例如:020L,010LL,0x30uL,0x40ull 。
參考資料:C Primer Plus, 5th Edtion By Stephen Prata
The C Programming Language 2e By K&R
C99 標準
整型常量
十進位制、八進位制和十六進位制的整型常量可加字尾以指示型別,如下表所示。
表 2–1 資料型別字尾
字尾 | 型別 |
---|---|
u 或 U | unsigned |
l或L | long |
ll 或 LL | long long [long long 和 unassigned long long 在 -xc99=none 和 -Xc 模式下不可用。] |
lu、LU、Lu、lU、ul、uL、Ul 或 UL | unsigned long |
llu、LLU、LLu、llU、ull、ULL、uLL、 Ull | unsigned long long |
如果設定 -xc99=all,編譯器將根據常量大小,使用以下列表中可以表示該值的第一項:
int
long int
long long int
如果值超過 long long int 可表示的最大值,編譯器會發出警告。
如果設定 -xc99=none,則為無後綴常量指定型別時,編譯器將根據常量大小,使用以下列表中可以表示該值的第一項:
int
long int
unsigned long int
long long int
unsigned long long int