大端模式 小端模式
阿新 • • 發佈:2017-10-16
測試 根據 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是平臺無關的,默認是大端。在網絡上傳輸數據普遍采用的都是大端。詳見
大端模式 小端模式