大小端: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。所以就可以判斷該當前環境的工作的大小端模式了。呵呵。