數據存儲大小端


大小端模式介紹

  • 大端(存儲)模式:是指一個數據的低位字節序的內容放在高地址處,高位字節序存的內容放在低地址處。
  • 小端(存儲)模式:是指一個數據的低位字節序內容存放在低地址處,高位字節序的內容存放在高地址處。(可以總結為“小小小”即低位、低地址、小端)

MSB:MoST Significant Bit :最高有效位。
LSB:Least Significant Bit :最低有效位。

big-endian

MSB存放在最低端的地址上。

舉例,雙字節數0x1234以big-endian的方式存在起始地址0x00002000中:

| data |<-- address
| 0x12 |<-- 0x00002000
| 0x34 |<-- 0x00002001

在Big-Endian中,對於bit序列中的序號編排方式如下(以雙字節數0x8B8A為例):

bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15
------MSB----------------------------------LSB
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
+--------------------------------------------+
= 0x8 B 8 A 

little-endian

little-endian:LSB存放在最低端的地址上。
舉例,雙字節數0x1234以little-endian的方式存在起始地址0x00002000中:

| data |<-- address
| 0x34 |<-- 0x00002000
| 0x12 |<-- 0x00002001

在Little-Endian中,對於bit序列中的序號編排和Big-Endian剛好相反,其方式如下(以雙字節數0x8B8A為例):

bit | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
------MSB-----------------------------------LSB
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
+---------------------------------------------+
= 0x8 B 8 A 

大端小端檢測方法

#include <stdio.h>


int main()
{

    unsigned short x = 0x1234;
    char x0,x1;

    x0 = ((char*)&x)[0]; 
    printf("low address of x0 is%x:\n",&x0);
    x1 = ((char*)&x)[1];
    printf("high address of x1 is%x:\n",&x1);

    printf("x0=0x%x\nx1=0x%x\n",x0,x1);//if output is x0=0x12,x1=0x34,it's big end,else it's little end
    return 0;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM