C語言的各種資料結構所佔的位元組數

2021-07-11 09:33:17 字數 2650 閱讀 1413

和機器字長及編譯器有關係:

所以,int,long int,short int的寬度都可能隨編譯器而異。但有幾條鐵定的原則(ansi/iso制訂的):

1 sizeof(short int)<=sizeof(int)

2 sizeof(int)<=sizeof(long int)

3 short int至少應為16位(2位元組)

4 long int至少應為32位。

unsigned 是無符號的意思。

例如:

16位編譯器

char :1個位元組

char*(即指標變數): 2個位元組

short int : 2個位元組

int: 2個位元組

unsigned int : 2個位元組

float: 4個位元組

double: 8個位元組

long: 4個位元組

long long: 8個位元組

unsigned long: 4個位元組

32位編譯器

char :1個位元組

char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器)

short int : 2個位元組

int: 4個位元組

unsigned int : 4個位元組

float: 4個位元組

double: 8個位元組

long: 4個位元組

long long: 8個位元組

unsigned long: 4個位元組

64位編譯器

char :1個位元組

char*(即指標變數): 8個位元組

short int : 2個位元組

int: 4個位元組

unsigned int : 4個位元組

float: 4個位元組

double: 8個位元組

long: 8個位元組

long long: 8個位元組

unsigned long: 8個位元組

注意:

1.singned和unsingned所佔位元組是相同的

2.格式字元 意義

d 以十進位制形式輸出帶符號整數(正數不輸出符號)

o 以八進位制形式輸出無符號整數(不輸出字首0)

x,x 以十六進製制形式輸出無符號整數(不輸出字首ox)

u 以十進位制形式輸出無符號整數

f 以小數形式輸出單、雙精度實數

e,e 以指數形式輸出單、雙精度實數

g,g 以%f或%e中較短的輸出寬度輸出單、雙精度實數

c 輸出單個字元

s 輸出字串

zu 輸出無符號10進製整數

3.指標的長度取決於使用的機器和編譯器,例如:在現代windows上,指標是32位或是64位長

4.關於結構體的大小:

結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體:

struct stu1

; 先介紹乙個相關的概念——偏移量。偏移量指的是結構體變數中成員的位址和結構體變數位址的差。結構體大小等於最後乙個成

員的偏移量加上最後乙個成員的大

小。顯然,結構體變數中第乙個成員的位址就是結構體變數的首位址。因此,第乙個成員i的偏移量為0。第二個成員c的偏移量是第乙個成員的偏移量加上第乙個

成員的大小(0+4),其值為4;第三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小(4+1),其值為5。

實際上,由於儲存變數時位址對齊的要求,編譯器在編譯程式時會遵循兩條原則:一、結構體變數中成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍) 二、結構體大小必須是所有成員大小的整數倍。

對照第一條,上面的例子中前兩個成員的偏移量都滿足要求,但第三個成員的偏移量為5,並不是自身(int)大小的整數倍。編譯器在處理時會在第二個成員後面補上3個空位元組,使得第三個成員的偏移量變成8。

對照第二條,結構體大小等於最後乙個成員的偏移量加上其大小,上面的例子中計算出來的大小為12,滿足要求。

再看乙個滿足第一條,不滿足第二條的情況

struct stu2

; 成員k的偏移量為0;成員t的偏移量為4,都不需要調整。但計算出來的大小為6,顯然不是成員k大小的整數倍。因此,編

譯器會在成員t後面補上2個位元組,使得結構體的大小變成8從而滿足第二個要求。

由此可見,大家在定義結構體型別時需要考慮到位元組對齊的情況,不同的順序會影響到結構體的大小。對比下面兩種定義順序

struct stu3

struct stu4

雖然結構體stu3和stu4中成員都一樣,但sizeof(struct stu3)的值為12而sizeof(struct stu4)的值為8。

如果結構體中的成員又是另外一種結構體型別時應該怎麼計算呢?只需把其展開即可。但有一點需要注意,展開後的結構體的第乙個成員的偏移量應當是被展開的結構體中最大的成員的整數倍。看下面的例子:

struct stu5

ss;

int k;

} 結構體stu5的成員ss.c的偏移量應該是4,而不是2。整個結構體大小應該是16。

如何給結構體變數分配空間由編譯器決定,以上情況針對的是linux下的gcc。其他平台的c編譯器可能會有不同的處理。

筆記 關於c語言中各種資料型別所佔位元組。

struct st int sz sizeof struct st 先上題,如上,在64位處理器執行後sz的值為什麼?考點 1.struct的對齊原則,注意不同的編譯器有不同的效果。2。不同的資料型別在32位和64位下所佔位元組的區別 32位編譯器 char 1個位元組 char 即指標變數 4個位...

活用各種資料結構

吊車由n條不同長度的線段組成,每條線段首尾相接。初始狀態 每條線段垂直與x軸。每次操作改變第s條和 s 1 條的逆時針角度為a,詢問每次操作後第n段末尾的座標。將每條線段都當成向量,實際上每次詢問的結果是向量和 每次改變第s段和第 s 1 段的相對角度,實際上是改變了從第 s 1 段至第n段的各節點...

redis 各種資料結構的encoding實現

redis 各種資料結構的encoding實現 redis type命令實際返回的就是當前鍵的資料結構型別,它們分別是 string 字串 hash 雜湊 list 列表 set 集合 zset 有序集合 但這些只是redis對外的資料結構。我們可以通過object encoding命令查詢內部編碼...