1. 程式人生 > 其它 >C語言中的整數(short,int,long)

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

,讓整數佔用更多的記憶體可以在 int 前邊加long,例如:

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。


總結起來,它們的長度(所佔位元組數)關係為:

2shortintlong

這就意味著,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輸出 shortlong 型別的風險較低,如果你的編譯器設定只對較高風險的操作發出警告,那麼此處你就看不到警告資訊。

C語言中的整數(short,int,long) (biancheng.net)