位元組對齊 位域 位元組序

2021-07-10 17:53:08 字數 2593 閱讀 9252

測試環境:win 7 64bits,vmware workstation 12 pro,ubuntu 15.10 64bits,使用gcc version 5.2.1 20151010

# include 

#pragma pack(1) //14,11,11

//#pragma pack(2) //16,12,12

//#pragma pack(4) //16,12,12

//#pragma pack(8) //16,16,16

struct test1

;struct test2

;struct test3

;int main(int argc, char **argv)

union tagaaaa  

half;

int li;

}number;

struct tagbbbb

half;

struct tagcccc

half;

int li;

};// 在位元組對齊為1下,sizeof(union tagaaaa)、sizeof(struct tagbbbb)、sizeof(struct tagcccc)是4,6,8

// 在位元組對齊為2下,sizeof(union tagaaaa)、sizeof(struct tagbbbb)、sizeof(struct tagcccc)是6,8,10

//在位元組對齊為4下,sizeof(union tagaaaa)、sizeof(struct tagbbbb)、sizeof(struct tagcccc)是8,8,12

//下述結構共佔3位元組

struct _record_struct

* env_alarm_record ;

//下述結構共佔4位元組

struct _record_struct1

;//下述結構共佔2位元組

struct _record_struct2

;//下述結構共佔4位元組

struct _record_struct3

;

//以下程式在小端序的情況下輸出的結果是 01 26 00 00  

//超過位數按照截斷處理,注意是16進製制輸出

#pragma pack(4)/*四位元組對齊*/

int main(int argc, char* argv)

*pstpimdata;

pstpimdata = (struct tagpim *)puc;

memset(puc, 0, 4);

pstpimdata->ucpim1 = 1;

pstpimdata->ucdata0 = 2;

pstpimdata->ucdata1 = 3;

pstpimdata->ucdata2 = 4;

printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);

return0;}

#pragma pack()/*恢復預設對齊方式*/

struct*p; 

//1位元組對齊情況下

p = 0x100000;

p + 0x1 = 0x100018

//18 = 24(10)

(unsigned

long)p + 0x1 = 0x100001

(unsigned

long *)p + 0x1 = 0x100004

(char *)p + 0x1 = 0x100001

ulong atm_uni_getparaulongvalbyoid(uchar *

type );

ulong atm_uni_mapiptable_deletehandler (void

* pmsgrcv, void

** ppmsgsnd)

//在小端位元組序下列印輸出的值是多少? 45678912

//在大端位元組序下列印輸出的值是多少? 126789ab

# include 

# include

union bits8_tag

byte;//1個8 bits

}value;

union bytes8_tag

byte1;//4個8 bits

}value1;

int main(int argc, char **argv)

//output

1,40,0,0,0,0

1,1,0,0,0

0,0,0,0,0

1,1,0,0,0

0,0,0,0,0

64,0,0,0,1 //2^6

0,0,0,0,0

16777216,0,0,0,1 //2^24

struct trap

;//則轉換成小端序為:

struct trap

;

位域位元組對齊

使用位域的主要目的是壓縮儲存,其大致規則為 1 如果相鄰位域字段的型別相同,且其位寬之和小於型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止 2 如果相鄰位域字段的型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數...

位元組序與位元組對齊

一.網路位元組序與主機位元組序 1.大端和小端儲存 大端 big endian 高位存低位址。符合人類的正常思維。網路位元組序採用大端 網路傳輸的是位元組流 小端 littile endian 低位存低位址。如果將乙個32位的整數0x12345678存放到乙個整型變數 int 中,這個整型變數採用大...

Linux 位元組序與位元組對齊優化

1.位元組序跟linux windows無關,是由cpu構架決定 同乙個cpu不管裝的是windows 或 linux 位元組序都是一樣的 2.位元組對齊 linux 全用 attribute packed 作用於結構體,類似於pragma packet 1 使用方法如下 typdef struct...