大端和小端,字节对齐
1)Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。
2)Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。
| 內存地址 | 小端模式存放內容 | 大端模式存放內容 |
| 0x4000 | 0x34 | 0x12 |
| 0x4001 | 0x12 | 0x34 |
判斷大小端的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;
只要保證同一個字符變量在一個字節上即可
轉載于:https://blog.51cto.com/lihaichuan/1304010
總結
以上是生活随笔為你收集整理的大端和小端,字节对齐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基本页面首页代码
- 下一篇: VMware View 5.2 安装实施