摘要:你知道內(nèi)存是怎么讀取數(shù)據(jù)的嗎赃绊?知道數(shù)據(jù)是怎么一個(gè)一個(gè)字節(jié)發(fā)送的嗎?是低字節(jié)先發(fā)還是高字節(jié)先發(fā)羡榴?
大端模式和小端模式
大端模式和小端是實(shí)際的字節(jié)順序和存儲(chǔ)的地址順序?qū)?yīng)關(guān)系的兩種模式
- 大端模式:高位字節(jié)存放在低地址中碧查,低位字節(jié)存放在高地址中
- 小端模式:高位字節(jié)存放在高地址中,低位字節(jié)存放在低地址中
例:
32bit 的數(shù) 0x12345678 分別在大端和小端模式下校仑,在內(nèi)存中存放方式如下
內(nèi)存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
---|---|---|---|---|
小端模式 | 0x78 | 0x56 | 0x34 | 0x12 |
大端模式 | 0x12 | 0x34 | 0x56 | 0x78 |
內(nèi)存的讀寫(xiě)永遠(yuǎn)從低地址開(kāi)始讀/寫(xiě)
大端存儲(chǔ)模式有點(diǎn)兒類(lèi)似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向大增加么夫,而數(shù)據(jù)從高位往低位放;這和我們的閱讀習(xí)慣一致肤视。
小端模式則相反
如何判斷系統(tǒng)的存儲(chǔ)模式
uint32_t a = 0x12345678;
char *b = (char *)&a;
printf("0x0%x\n",*b);
輸出0x12 是大端档痪,0x78 則是小端