1)Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。
2)Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。
判斷大小端的C語言程序
inti=1;
char*p=(char*)&i;
if(*p==1)
printf("LittleEndian");
else
printf("BigEndian");
需要字節對齊的根本原因在於CPU訪問數據的效率問題,系統一次訪問0-3,3-7,等地址上的數據,若一個int型數據存儲在2,3,4,5地址上,則需要訪問內存兩次,如果存在0,1,2,3地址上,則只需訪問一次內存。
1、對於一個類型的數據,它存放的起始地址只要是它的類型的大小的整數倍就行了。若inta,則a只要存放在地址0,4,8,12.。。。。等地址上即可int為4字節)。若charb,則存放在0,1,2,3,4,5,。。。任意一個地址開始的就行。若shortb,則存放在0,2,4,6,8。。。等地址上。
float為4字節,double為8字節。其實對齊問題是考慮在結構體中的,單獨定義一個變量或數組好像考慮這個意義不大。
2、結構體是按其定義的數據類型的最大的那個對齊的。
structtest
{
charx1;
charx4;
shortx2;
charx5;
};
運行後的結果sizeof(test)=6;而不是5。
0:x11:x42-3:x24:x5
地址0存儲x1地址1存儲x4地址2、3存儲x2地址4存儲x5
主要是考慮到結構體數組的問題。結構體的大小必須是其中最大變量占用空間的整數倍。
structtest
{
charx1:2;
charx4:6;
charx2:7;
charx5:4;
};
sizeof(test)=3;
若修改為
structtest
{
charx1:2;
charx4:7;
charx2:7;
charx5:4;
};
sizeof(test)=4;
只要保證同一個字符變量在一個字節上即可
本文出自 “李海川” 博客,請務必保留此出處http://lihaichuan.blog.51cto.com/498079/1304010