所謂的大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中;
所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。
儲存資料0x1234,大端小端模式儲存如下:
記憶體位址
0x4000
0x4001
大端模式
0x12
0x34
小端模式
0x34
0x12
這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。例如乙個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於大端模式,就將0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。我們常用的x86結構是小端模式,而keil c51則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。
3、如何判斷所用的編譯器
是大端還是小端儲存?
(1)#include
void main()
(2)#include
void main()
c;c.a=1;
if(c.b==1)
printf("little_endian!\n");
else
printf("big_endian!\n");}
此處採用聯合體,聯合體共用儲存空間。總共分配4個位元組,記憶體位址及儲存方式如下。
記憶體位址大端模式小端模式
0x40000x000x01
0x40010x000x00
0x4002
0x00
0x00
0x4003
0x01
0x00
而c.b指向乙個位元組的儲存單元,既:0x4000單元。
(3)//(如果endianness=』l』表示系統為little endian,為』b』表示big endian )。
#include
static union endian_test = };
#define endianness ((char)endian_test.l)
void main()
4、我們所用的個人計算機一般是小端,網路傳輸用的是大端,經常遇到網路位元組序與小端位元組序的轉換。
#include
typdedef unsigned int u_32;
typedef unsigned short u_16;
#define
bswap_16(x) /
(u16)((
(((u16)
(x))
& 0x00ff)
<
< 8 )
| /(((
(u16)
(x))
& 0xff00)
>
> 8 ) /
)#define bswap_32(x) /
(u32) ( (( ((u32)(x)) & 0xff000000 ) >> 24) | /
(( ((u32)(x)) & 0x00ff0000 ) >> 8 ) | /
(( ((u32)(x)) & 0x0000ff00 ) << 8 ) | /
(( ((u32)(x)) & 0x000000ff ) << 24) /
)u16 bswap16(u16 x)
u32 bswap32(u32 x)
int main(void)
大端小端詳解
用c語言寫程式時需要知道是大端模式還是小端模式。所謂的大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單...
大小端詳解
前言 本篇文章介紹資料儲存的大小端模式,大小端模式起源於吃雞蛋的典故。首先,我們看一下資料在記憶體是怎麼儲存的 從上邊我們可以看出a b在計算機中儲存的是補碼,但是順序卻倒著的,這實際上就是小端儲存 大端儲存模式 是指資料的低位位元組序儲存在記憶體的高位址中,而資料的高位位元組序儲存在記憶體的低位址...
移動端詳解
由裝置型別 監測裝置特性表示式構成。語法 media 裝置型別 all screen and 條件表示式 注 and兩側必須有空格 not放在裝置型別的前面 反向選擇 排除某個範圍 ppi 每英吋所顯示畫素點的密度 ppi值越高 螢幕顯示越清晰 dpi 每英吋所顯示畫素點的個數 dpr 裝置畫素比例...