C語言中的大小端

來源:互聯網
上載者:User

最近的狀態真是糟糕透了,連大端小端的問題也含含糊糊才搞出來,還是基礎不夠紮實呀!

     平時不做大端小端的判斷(預設都是小端),時間長了就只彷彿記得大端小端和雞蛋有關係^:^

一、大端小端的概念(以下概念來自網路)

端模式(Endian)的這個詞出自Jonathan Swift書寫的《格列佛遊記》。這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為Big Endian,從尖頭開始將雞蛋敲開的人被歸為Littile Endian。小人國的內戰就源於吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開。在電腦業Big Endian和Little Endian也幾乎引起一場戰爭。在電腦業界,Endian表示資料在儲存空間中的存放順序。下文舉例說明在電腦中大小端模式的區別。

如果將一個32位的整數0x12345678存放到一個整型變數(int)中,這個整型變數採用大端或者小端模式在記憶體中的儲存由下表所示。為簡單起見,本書使用OP0表示一個32位元據的最高位元組MSB(Most Significant Byte),使用OP3表示一個32位元據最低位元組LSB(Least Significant Byte)。

地址位移

大端模式

小端模式

0x00

12(OP0)

78(OP3)

0x01

34(OP1)

56(OP2)

0x02

56(OP2)

34(OP1)

0x03

78(OP3)

12(OP0)

如果將一個16位的整數0x1234存放到一個短整型變數(short)中。這個短整型變數在記憶體中的儲存在大小端模式由下表所示。

地址位移

大端模式

小端模式

0x00

12(OP0)

34(OP1)

0x01

34(OP1)

12(OP0)

由上表所知,採用大小模式對資料進行存放的主要區別在於在存放的位元組順序,大端方式將高位存放在低地址,小端方式將低位存放在低地址。採用大端方式 進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於電腦處理。到目前為止,採用大端或者小端進行資料存放,其孰優孰劣也沒有定論。

二、程式判斷

#i nclude <stdio.h>

union little_big_end
{
 short x16;
 long y32;
};

int main(void)
{
 little_big_end lbe;

 printf("the size of lbe=%d\n",sizeof(lbe));

 lbe.y32 = 0x12345678;

 if(lbe.x16 == 0x1234 )
 {
  printf("the memory format is big end!\n");
 }
 else if(lbe.x16 == 0x5678 )
 {
  printf("the memory format is little end!\n");
 }

 getchar();

 return 0;
}

當然,直接存入0x12345678,再讀取低地址資料做判斷也可以做判斷。(這裡順便複習一下共用體的用法)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.