大小端存儲模式的理解和判斷


在計算機系統中,存儲是以字節為單位的,每個地址單元都對應着一個字節,一個字節=8bit。在C語言中除了8bitchar之外,還有16bitshort型,32bitlong型(要看具體的編譯器)。對於位數大於8位的處理器,例如16位或者32位的處理器,由於寄存器寬度大於一個字節,如何安排多個字節的存儲,這就有了大端存儲模式和小端存儲模式。

 

 

小端:較高的有效字節存放在較高的的存儲器地址,較低的有效字節存放在較低的存儲器地址。 大端:較高的有效字節存放在較低的存儲器地址,較低的有效字節存放在較高的存儲器地址。 如果將一個16位的整數0x1234存放到一個短整型變量(short)中。這個短整型變量在內存中的存儲在大小端模式由下表所示。

 

地址偏移

大端模式

小端模式

0x00

12OP0

34OP1

0x01

34OP1

12OP0

小端模式:強制轉換數據不需要調整字節內容,124字節的存儲方式一樣。

大端模式:符號位的判定固定為第一個字節,容易判斷正負。

常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARMDSP都為小端模式。

 

 

什么時候要進行大小端字節序的轉換?  

 

short 或者 long的數據在進行通信的時候最好養成:  1、發送的時候使用:htonsl 2、接受的時候使用:ntohsl 而不要理會兩邊的通信是否需要這么做~~  當然了一般我都不用int型的數據通信,從來都是字符串通信,發送方利用sprintf組織,接收方利用atoi進行轉換~~

 

 

C語言判斷大小端模式

方法一:

void IsBigEndian()
{
 short int a = 0x1122;//十六進制,一個數值占4位
 char b =  *(char *)&a;  //通過將short(2字節)強制類型轉換成char單字節,b指向a的起始字節(低字節)
 if( b == 0x11)//低字節存的是數據的高字節數據
 {
  //是大端模式
 }
 else
 {
  //是小端模式
 }
}

方法二:

void IsBigEndian()//原理:聯合體union的存放順序是所有成員都從低地址開始存放,而且所有成員共享存儲空間
{
 union temp
 {
  short int a;
  char b;
 }temp;
 temp.a = 0x1234;
 if( temp.b == 0x12 )//低字節存的是數據的高字節數據
 {
  //是大端模式
 }
 else
 {
  //是小端模式
 }
}

 


免責聲明!

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



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