重新審視大端和小端

來源:互聯網
上載者:User

以前彙編課上講過,但是我發現還不夠。。。下面全面介紹了大端和小端。

 

大端和小端的曆史:

一般吃雞蛋都是打破雞蛋大的一端再吃,但是有一次,一個國家的國王打雞蛋時把手指弄破了,後來,他下令:以後打雞蛋都從小端開始打。

為了諷刺這件事,就有了大端和小端的概念。

 

如果一個對象跨越多位元組連續儲存,則最小的地址就是對象的地址。

比如一個int,在32位和64位機器中都是4位元組,如果對象地址為0x100,則整個int佔據0x100,0x101,0x102,0x103.

我們都知道&符號,假如int x;  &x就為x的地址,即0x100.

[31,30,29,.....1,0]為有效位元,最高有效位為31,最低有效位為0。

小端法:最低有效位存在最前面。

                 0x100                                       0x101

---------------------------------------------------------------------------------------------------

|  7,6,5,4,3,2,1,0  |  15,14,13,12,11,10,9,8  | ....

----------------------------------------------------------------------------------------------------

大端法:最高有效位存在最前面。

      0x100                                       0x101

---------------------------------------------------------------------------------------------------

|  31,30,29,28,27,26,25,24| 23,22,21,20,19,18,17,16| ....

----------------------------------------------------------------------------------------------------

這兩張圖的對比就很明顯的看出區別,就比如int x=2; 轉換為16進位為0x00 00 00 02;

小端的存放順序為:

     0x100         0x101        0x102       0x103

----------------------------------------------------

|     02      |       00      |      00      |      00      |

----------------------------------------------------

上面已經說過&x取得的是0x100,一般情況下程式員是看不出位元組順序的區別的。

在linux32中,結果為小端儲存。

以下是檢測大端小端的代碼,

記住*****:我們要檢測大端小端,必須要把他轉化為unsigned char * ch才可以。因為這個ch[i]是一個位元組。

 

--------------------------------------------------------------------------------------------------------------------

#include<stdio.h><br />typedef unsigned char *byte_pointer;<br />void show_bytes(byte_pointer start,int len)<br />{<br />int i;<br />for(i=0;i<len;i++)<br />printf(" %.2x",start[i]);<br />printf("/n");<br />}</p><p>void show_int(int x)<br />{<br />show_bytes((byte_pointer)&x,sizeof(int));<br />}<br />void show_float(float x)<br />{<br />show_bytes((byte_pointer)&x,sizeof(float));<br />}<br />void test()<br />{<br />int val=0x87654321;<br />byte_pointer valp=(byte_pointer)&val;<br />show_bytes(valp,4);<br />printf("/n");<br />int val1=3510593;<br />float val2=3510593.0;<br />show_int(val1);<br />show_float(val2);<br />}</p><p>int main()<br />{<br />test();<br />return 0;<br />}<br />

int x=0x12345678;

unsigned char *val=(unsigned char *)&x;   //x的地址。

val[0] 為val的地址只指向的位元組。

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.