1. 程式人生 > >大端模式 小端模式

大端模式 小端模式

測試 根據 apt har 地址 不同 目前 i++ lock

簡介

大端小端模式指的是不同類型的處理器在數據存儲時的區別。。

  • 大端模式(高尾端模式即末端在高位):將數據的高字節放在低地址中,低字節放在高地址中。
  • 小端模式(低尾端模式即末端在低位):將數據的高字節放在高地址中,低字節放在低地址中。

如: 0x01020304

在大端模式的機器中存儲形式如圖:

高地址<---------------------------------------------------------低地址
04 03 02 01

在小端模式的機器中存儲形式如圖:

高地址<------------------------------------------------------低地址
01 02 03 04

判斷

可以使用程序測試本地機器是大端模式還是小端模式,

#include "stdafx.h"
#include "Windows.h"

//         高地址  <---------------  低地址
//大端存儲:04 03 02 01
//小端存儲:01 02 03 04
#define Testdata 0x01020304  //測試數據

union TestEndMode
{
    unsigned int u;
    unsigned char c[4];
};

int main(int argc, char* argv[])
{

/*    unsigned int a;
    int b = sizeof(char);
    BYTE c = 0x12;//十六進制:以0x開頭
    BYTE d = 012;//八進制:以0開頭
    printf("%d  %d",c,d);
*/ int i; TestEndMode tstMode; tstMode.u = Testdata; printf("%08x\n", tstMode.u); for (i = 0; i < 4; i++) printf("%02x", (unsigned int)(unsigned char)tstMode.c[i]); printf("\n");//輸出:01020304 處理器為大端模式;04030201 處理器為小端模式 return 0; }

翻轉

當不同的處理器的硬件通信時,大小端模式必然要多加考慮。一旦有大小端的區別,有一方必然要對數據進行處理。在處理時針對數據進行高低顛倒。可以根據聯合體union的特點對數據進行翻轉。

union TestEndModeUInt
{
    unsigned int value;//根據不同的數據類型,改變該類型
    unsigned char swapTemp[4];//數組長度需要根據類型進行更改
};

unsigned int SwapInt(unsigned int value)
{
   int i = 0;
   TestEndModeUInt tstUInt;
   tstUInt.value = value;
   unsigned char temp;
   int len = sizeof(value);

    for(i = 0; i< len/2; i++)
    {
        temp = tstUInt.swapTemp[i];
        tstUInt.swapTemp[i] = tstUInt.swapTemp[len-i-1];
        tstUInt.swapTemp[len-i-1] = temp;        
    }
    return tstUInt.value;
}

存在狀況

目前Intel的80x86系列芯片是唯一還在堅持使用小端的芯片,ARM芯片默認采用小端,但可以切換為大端;而MIPS等芯片要麽采用全部大端的方式儲存,要麽提供選項支持大端——可以在大小端之間切換。另外,對於大小端的處理也和編譯器的實現有關,在C語言中,默認是小端(但在一些對於單片機的實現中卻是基於大端,比如Keil 51C),Java是平臺無關的,默認是大端。在網絡上傳輸數據普遍采用的都是大端。詳見

大端模式 小端模式