C語言中的整數(short,int,long)
整數是程式設計中常用的一種資料,C語言通常使用int
來定義整數(int 是 integer 的簡寫)。
在現代作業系統中,int一般佔用 4 個位元組(Byte)的記憶體,共計 32 位(Bit)。如果不考慮正負數,當所有的位都為 1 時它的值最大,為 232-1 = 4,294,967,295 ≈ 43億,這是一個很大的數,實際開發中很少用到,而諸如 1、99、12098 等較小的數使用頻率反而較高。
使用 4 個位元組儲存較小的整數綽綽有餘,會空閒出兩三個位元組來,這些位元組就白白浪費掉了,不能再被其他資料使用。現在個人電腦的記憶體都比較大了,配置低的也有 2G,浪費一些記憶體不會帶來明顯的損失;而在C語言被髮明的早期,或者在微控制器和嵌入式系統中,記憶體都是非常稀缺的資源,所有的程式都在盡力節省記憶體。
反過來說,43 億雖然已經很大,但要表示全球人口數量還是不夠,必須要讓整數佔用更多的記憶體,才能表示更大的值,比如佔用 6 個位元組或者 8 個位元組。
讓整數佔用更少的記憶體可以在 int 前邊加short
short int a = 10; short int b, c = 99; long int m = 102023; long int n, p = 562131;
這樣 a、b、c 只佔用 2 個位元組的記憶體,而 m、n、p可能會佔用 8 個位元組的記憶體。
也可以將 int 省略,只寫 short 和 long,如下所示:
short a = 10; short b, c = 99; long m = 102023; long n, p = 562131;
這樣的寫法更加簡潔,實際開發中常用。
int 是基本的整數型別,short 和 long 是在 int 的基礎上進行的擴充套件,short 可以節省記憶體,long 可以容納更大的值。
short、int、long 是C語言中常見的整數型別,其中 int 稱為整型,short 稱為短整型,long 稱為長整型。
整型的長度
細心的讀者可能會發現,上面我們在描述 short、int、long 型別的長度時,只對 short 使用肯定的說法,而對 int、long 使用了“一般”或者“可能”等不確定的說法。這種描述的言外之意是,只有 short 的長度是確定的,是兩個位元組,而 int 和 long 的長度無法確定,在不同的環境下有不同的表現。
一種資料型別佔用的位元組數,稱為該資料型別的長度。例如,short 佔用 2 個位元組的記憶體,那麼它的長度就是 2。
實際情況也確實如此,C語言並沒有嚴格規定 short、int、long 的長度,只做了寬泛的限制:
- short 至少佔用 2 個位元組。
- int 建議為一個機器字長。32 位環境下機器字長為 4 位元組,64 位環境下機器字長為 8 位元組。
- short 的長度不能大於 int,long 的長度不能小於 int。
總結起來,它們的長度(所佔位元組數)關係為:
2 ≤ short ≤ int ≤ long
這就意味著,short 並不一定真的”短“,long 也並不一定真的”長“,它們有可能和 int 佔用相同的位元組數。
在 16 位環境下,short 的長度為 2 個位元組,int 也為 2 個位元組,long 為 4 個位元組。16 位環境多用於微控制器和低階嵌入式系統,在PC和伺服器上已經見不到了。
對於 32 位的 Windows、Linux 和 Mac OS,short 的長度為 2 個位元組,int 為 4 個位元組,long 也為 4 個位元組。PC和伺服器上的 32 位系統佔有率也在慢慢下降,嵌入式系統使用 32 位越來越多。
在 64 位環境下,不同的作業系統會有不同的結果,如下所示:
目前我們使用較多的PC系統為 Win XP、Win 7、Win 8、Win 10、Mac OS、Linux,在這些系統中,short 和 int 的長度都是固定的,分別為 2 和 4,大家可以放心使用,只有 long 的長度在 Win64 和類 Unix 系統下會有所不同,使用時要注意移植性。
sizeof 操作符
獲取某個資料型別的長度可以使用 sizeof 操作符,如下所示:
#include <stdio.h> int main() { short a = 10; int b = 100; int short_length = sizeof a; int int_length = sizeof(b); int long_length = sizeof(long); int char_length = sizeof(char); printf("short=%d, int=%d, long=%d, char=%d\n", short_length, int_length, long_length, char_length); return 0; }
在 32 位環境以及 Win64 環境下的執行結果為:
short=2, int=4, long=4, char=1
在 64 位 Linux 和 Mac OS 下的執行結果為:
short=2, int=4, long=8, char=1
sizeof 用來獲取某個資料型別或變數所佔用的位元組數,如果後面跟的是變數名稱,那麼可以省略( )
,如果跟的是資料型別,就必須帶上( )
。
需要注意的是,sizeof 是C語言中的操作符,不是函式,所以可以不帶( )
,後面會詳細講解。
不同整型的輸出
使用不同的格式控制符可以輸出不同型別的整數,它們分別是:
%hd
用來輸出 short int 型別,hd 是 shortdecimal 的簡寫;%d
用來輸出 int 型別,d 是decimal 的簡寫;%ld
用來輸出 long int 型別,ld 是 longdecimal 的簡寫。
下面的例子演示了不同整型的輸出:
#include <stdio.h> int main() { short a = 10; int b = 100; long c = 9437; printf("a=%hd, b=%d, c=%ld\n", a, b, c); return 0; }
執行結果:
a=10, b=100, c=9437
在編寫程式碼的過程中,我建議將格式控制符和資料型別嚴格對應起來,養成良好的程式設計習慣。當然,如果你不嚴格對應,一般也不會導致錯誤,例如,很多初學者都使用%d
輸出所有的整數型別,請看下面的例子:
#include <stdio.h> int main() { short a = 10; int b = 100; long c = 9437; printf("a=%d, b=%d, c=%d\n", a, b, c); return 0; }
執行結果仍然是:
a=10, b=100, c=9437
當使用%d
輸出 short,或者使用%ld
輸出 short、int 時,不管值有多大,都不會發生錯誤,因為格式控制符足夠容納這些值。
當使用%hd
輸出 int、long,或者使用%d
輸出 long 時,如果要輸出的值比較小(就像上面的情況),一般也不會發生錯誤,如果要輸出的值比較大,就很有可能發生錯誤,例如:
#include <stdio.h> int main() { int m = 306587; long n = 28166459852; printf("m=%hd, n=%hd\n", m, n); printf("n=%d\n", n); return 0; }
在 64 位 Linux 和 Mac OS 下(long 的長度為 8)的執行結果為:
m=-21093, n=4556
n=-1898311220
輸出結果完全是錯誤的,這是因為%hd
容納不下 m 和 n 的值,%d
也容納不下 n 的值。
讀者需要注意,當格式控制符和資料型別不匹配時,編譯器會給出警告,提示程式設計師可能會存在風險。
編譯器的警告是分等級的,不同程度的風險被劃分成了不同的警告等級,而使用%d輸出 short 和 long 型別的風險較低,如果你的編譯器設定只對較高風險的操作發出警告,那麼此處你就看不到警告資訊。