查看CPU的大小端模式

來源:互聯網
上載者:User

大小端:CPU對記憶體單中繼資料的排列順序的方式.
    採用小端(Little-endian)模式的CPU對運算元的存放方式是從低位元組到高位元組(從右至左即從低到高);這是X86平台採用的模式;
    採用大端(Big-endian)模式對運算元的存放方式是從高位元組到低位元組;在網路上傳送的資料採用的方式;
例如:
16bits寬的數:0x1234在Little-endian模式的CPU中記憶體的存放方式為:
0x4000 0x34
0x4001 0x12
而在Big-endian中則為:
0x4000 0x12

0x4000 0x34

測試你當前環境的CPU的工作方式(即查看大小端)

#include <stdio.h>#include <stdlib.h>union word{int a;char b;}c;int checkCPU(void){c.a = 1;return (c.b == 1);}int main(void){int i = checkCPU();if ( i==0 ){fprintf(stdout, "this is Big_endian\n");}else if ( i==1 ){fprintf(stdout, "this is Little_endian\n");}return 0;}

為什麼可以這樣子檢測出來呢?這是利用C語言的共同體的特性:所有成員都是從低地址開始存放的。

讓我們來分析以上的代碼:(假設是在X86,並假設是在低端模式的,然後證明它,即數學上的反證法啦。呵呵)平台下32bits下存放的:

a, b在記憶體中的排列:

地址                          資料(a)    資料(b)     

000000001             0x01             0x??

000000002             0x00

000000003             0x00

000000004             0x00

 

我們在checkCPU中將int a賦值為1.為什麼可根據return (c.b == 1)的判定結果來判斷大小端呢?注意到,我們沒有為c.b賦值,所以它的值會是之前(即a)的資料存放的值。注意到,共同體的特性是:所有成員都是從低地址開始存放的。所以如果是在低端模式下:c.b的值應該是0x01。在高端模式下,c.b的值應該是0x00。所以就可以判斷該當前環境的工作的大小端模式了。呵呵。

聯繫我們

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