1. 程式人生 > >C語言幾種整形型別的區別

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 為無符號短整型。以此類推。

  1. 宣告方式
    這些整數型別的宣告方式與 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。

  2. 取值範圍(表示範圍)
    標準也規定了這些整數型別的最小取值範圍。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),執行結果將會出錯。

  3. 整數型別的選擇
    如果您要處理的只是非負整數,那麼應該優先使用 unsigned 打頭的那些整數型別。如果您要處理的整數超出了 int 所能表示的範圍,並且您的編譯器中,long 的表示範圍比 int 大,那就使用 long。不過,若非必要,儘量不要用 long,因為它可能會降低程式執行效率。有一點要注意:如果您的編譯器中,long 和 int 都是 32 位的,並且您需要使用 32 位整數,那麼應該用 long,而不要用 int。只有這樣,我們的程式才可以安全地移植到 16 位的計算機,因為 16 位的計算機中,int 一般也是 16 位的。類似地,如果您需要使用 64 位整數,那就用 long long。如果 int 是 32 位的話,那麼使用 short 可以節省空間,不過您得確保您要處理的整數不會超出 short 的表示範圍。這種“節省”對記憶體大的計算機來說,是沒什麼意義的。

  4. 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