大端與小端:
小端:位元組的低位放在記憶體低位位址,高位放在記憶體高位位址。
判斷系統是大端還是小端?
若判斷處理器是big還是little模式,有兩種方法。
1、int i=1;
char *p=(char *)&i;
if(*p==1)
printf("小端");
else
printf("大端");
大小端儲存問題,如果小端方式(i佔至少兩個位元組的長度)則i所分配的記憶體最小位址那個位元組中就存著1,其他位元組是0.大端的話則1在i的最高位址位元組處存放,char是乙個位元組,所以強制將char型量p指向i則p指向的一定是i的最低位址,那麼就可以判斷p中的值是不是1來確定是不是小端
位元組對齊:
結構體的對齊參
1.union
#include
typedef union
u11;//首先按照char c[10]分配10個位元組,然後按照char的1個位元組對齊,最終sizeof(u11)=10;
typedef union
u22;//首先按照char c[10]分配10個位元組,然後按照char的4個位元組對齊,最終sizeof(u11)=12;
typedef union
u33;//首先按照char c[10]分配10個位元組,然後按照char的8個位元組對齊,最終sizeof(u11)=16;
int main(void)
結果:
2.struct
#include
structa;//sizeof(short)=2,都是short,以2個位元組整數倍對齊,最後為6.
structb;//sizeof(long)=4,sizeof(short)=2,以4個位元組整數倍對齊,最後為8。
int main(void)
結果:
編譯器中提供了
#pragma pack(n)來設定變數以n
位元組對齊方式。n位元組對齊就是說變數存放的起始位址的
偏移量有兩種情況:第
一、如果n大於等於該變數所占用的位元組數,那麼偏移量必須滿足預設的對齊方式,第
二、如果n小於該變數的型別所占用的位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大於所有
成員變數型別所占用的位元組數,那麼結構的總大小必須為占用空間最大的變數占用的空間數的倍數;否則必須為n的倍數。
下面舉例說明其用法。
#pragma pack(push) //儲存對齊狀態
#pragma pack(4)//設定為4
位元組對齊
struct test
;#pragma pack(pop)//恢復對齊狀態
以上 結構體的大小為16,下面分析其儲存情況,首先為m1分配空間,其
偏移量為0,滿足我們自己設定的對齊方式(4
位元組對齊),m1大小為1個位元組。接著開始為m4分配空間,這時其偏移量為1,需要補足3個位元組,這樣使偏移量滿足為n=4的倍數(因為sizeof(double)大於4),m4占用8個位元組。接著為m3分配空間,這時其偏移量為12,滿足為4的倍數,m3占用4個位元組。這時已經為所有
成員變數分配了空間,共分配了16個位元組,滿足為n的倍數。如果把上面的
#pragma pack(4)改為#pragma pack(8),那麼我們可以得到結構的大小為24。
結構體成員的記憶體分布與對齊
我們先看一道 ibm和微軟的筆試題 ibm筆試題 structa structb sizeof a 6,sizeof b 8,為什麼?注 sizeof short 2,sizeof long 4 微軟筆試題 struct example1 struct example2 int main int a...
結構體成員的記憶體對齊
include void printf arr quint8 data,int len,quint8 base num if 16 base num printf n struct frame big struct frame small struct frame union union int m...
記憶體的大端小端儲存
只需要判斷低位址存放的是高位資料 大端儲存 還是低位資料 小段儲存 資料0x0a0b0c0d,位址0x1000,大端儲存為 不同的cpu處理記憶體資料的方式不同,以及cpu和網路處理資料的方式也可能不同,所以要指明大端還是小端。尤其是在做跨平台專案的時候。網路位元組序,是和大端系統一致。也就是網路上...