大端和小端,字节对齐
1)Little-Endian就是低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存的高地址端。
2)Big-Endian就是高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。
| 內(nèi)存地址 | 小端模式存放內(nèi)容 | 大端模式存放內(nèi)容 |
| 0x4000 | 0x34 | 0x12 |
| 0x4001 | 0x12 | 0x34 |
判斷大小端的C語(yǔ)言程序
inti=1;
char*p=(char*)&i;
if(*p==1)
printf("LittleEndian");
else
printf("BigEndian");
需要字節(jié)對(duì)齊的根本原因在于CPU訪問(wèn)數(shù)據(jù)的效率問(wèn)題,系統(tǒng)一次訪問(wèn)0-3,3-7,等地址上的數(shù)據(jù),若一個(gè)int型數(shù)據(jù)存儲(chǔ)在2,3,4,5地址上,則需要訪問(wèn)內(nèi)存兩次,如果存在0,1,2,3地址上,則只需訪問(wèn)一次內(nèi)存。
1、對(duì)于一個(gè)類(lèi)型的數(shù)據(jù),它存放的起始地址只要是它的類(lèi)型的大小的整數(shù)倍就行了。若inta,則a只要存放在地址0,4,8,12.。。。。等地址上即可(int為4字節(jié))。若charb,則存放在0,1,2,3,4,5,。。。任意一個(gè)地址開(kāi)始的就行。若shortb,則存放在0,2,4,6,8。。。等地址上。
float為4字節(jié),double為8字節(jié)。其實(shí)對(duì)齊問(wèn)題是考慮在結(jié)構(gòu)體中的,單獨(dú)定義一個(gè)變量或數(shù)組好像考慮這個(gè)意義不大。
2、結(jié)構(gòu)體是按其定義的數(shù)據(jù)類(lèi)型的最大的那個(gè)對(duì)齊的。
structtest
{
charx1;
charx4;
shortx2;
charx5;
};
運(yùn)行后的結(jié)果sizeof(test)=6;而不是5。
0:x11:x42-3:x24:x5
地址0存儲(chǔ)x1地址1存儲(chǔ)x4地址2、3存儲(chǔ)x2地址4存儲(chǔ)x5
主要是考慮到結(jié)構(gòu)體數(shù)組的問(wèn)題。結(jié)構(gòu)體的大小必須是其中最大變量占用空間的整數(shù)倍。
structtest
{
charx1:2;
charx4:6;
charx2:7;
charx5:4;
};
sizeof(test)=3;
若修改為
structtest
{
charx1:2;
charx4:7;
charx2:7;
charx5:4;
};
sizeof(test)=4;
只要保證同一個(gè)字符變量在一個(gè)字節(jié)上即可
轉(zhuǎn)載于:https://blog.51cto.com/lihaichuan/1304010
總結(jié)
以上是生活随笔為你收集整理的大端和小端,字节对齐的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基本页面首页代码
- 下一篇: VMware View 5.2 安装实施