C語言常見型別占用位元組數

2021-08-28 03:54:29 字數 3318 閱讀 2090

整數是程式設計中常用的一種資料,c語言通常使用int來定義整數(int 是 integer 的簡寫),這在《大話c語言變數和資料型別》中已經進行了詳細講解。

在現代作業系統中,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 的長度,只做了寬泛的限制:

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

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 位環境下,不同的作業系統會有不同的結果,如下所示:

作業系統

short

intlong

win64(64位 windows)24

4類unix系統(包括 unix、linux、mac os、bsd、solaris 等)24

8目前我們使用較多的pc系統為 win xp、win 7、win 8、win 10、mac os、linux,在這些系統中,short 和 int 的長度都是固定的,分別為 2 和 4,大家可以放心使用,只有 long 的長度在 win64 和類 unix 系統下會有所不同,使用時要注意移植性。

獲取某個資料型別的長度可以使用 sizeof 操作符,如下所示:

#include 

int main()

在 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語言中的操作符,不是函式,所以可以不帶( ),後面會詳細講解。

使用不同的格式控制符可以輸出不同型別的整數,它們分別是:

下面的例子演示了不同整型的輸出:

#include 

int main()

執行結果:

a=10, b=100, c=9437

在編寫**的過程中,我建議將格式控制符和資料型別嚴格對應起來,養成良好的程式設計習慣。當然,如果你不嚴格對應,一般也不會導致錯誤,例如,很多初學者都使用%d輸出所有的整數型別,請看下面的例子:

#include 

int main()

執行結果仍然是:

a=10, b=100, c=9437

當使用%d輸出 short,或者使用%ld輸出 short、int 時,不管值有多大,都不會發生錯誤,因為格式控制符足夠容納這些值。

當使用%hd輸出 int、long,或者使用%d輸出 long 時,如果要輸出的值比較小(就像上面的情況),一般也不會發生錯誤,如果要輸出的值比較大,就很有可能發生錯誤,例如:

#include 

int main()

在 64 位 linux 和 mac os 下(long 的長度為 8)的執行結果為:

m=-21093, n=4556

n=-1898311220

輸出結果完全是錯誤的,這是因為%hd容納不下 m 和 n 的值,%d也容納不下 n 的值。

讀者需要注意,當格式控制符和資料型別不匹配時,編譯器會給出警告,提示程式設計師可能會存在風險。

占用位元組數求法

字串占用位元組數 ansi char szstr abc 占用位元組數求法 sizeof szstr char psz defgh 占用位元組數求法 strlen psz sizeof char unicode wchar t szwstr l abc 占用位元組數求法 sizeof szwstr ...

Oracle 漢字占用位元組數

在oracle中乙個字元特別是中文字元佔幾個位元組是與字符集有關的。比如gbk,漢字就會佔兩個位元組,英文1個 如果是utf 8,漢字一般佔3個位元組,英文還是1個。但是一般情況下,我們都認為是兩個位元組處理,因為oracle安裝時候預設我們都選擇gbk的編碼格式,但是我們在頁面做輸入字串長度的校驗...

mysql 資料型別及占用位元組數

只有當設計表結構的時候才會思考資料型別的問題,很久不用就會忘記,寫篇部落格算是記錄加複習吧。以下摘自網路,也沒時間蒐集太多,就列舉幾個常用的。數字型別 根據位元組數即可算出表示的範圍了 tinyint 1 位元組 smallint 2 個位元組 mediumint 3 個位元組 int 4 個位元組...