1. 程式人生 > >【技巧】用union驗證機器為大端還是小端

【技巧】用union驗證機器為大端還是小端

union U{
     short a;
     char c;
};
U u;

在C Programming Language 一書中對於聯合體是這麼描述的:

     1)聯合體是一個結構;

     2)它的所有成員相對於基地址的偏移量都為0;

     3)此結構空間要大到足夠容納最"寬"的成員;

     4)其對齊方式要適合其中所有的成員;

所以一個聯合體在記憶體中的儲存形式如下圖:

從圖中,很容易看出變數a、c、u的地址都是0x20000000

u.a=0x1234;
小端模式(資料的高位元組儲存在記憶體的高地址中)下,儲存情況如下:

大端模式下(資料的高位元組儲存在記憶體的低地址中),儲存情況如下:


所以,只要我們取出變數c的值,進行比對;若其值為34h,則機器為小端模式,若其值為12h,則機器為大端模式。

實現程式碼如下:

#include <stdio.h>

union U{
    int a;
    char c;
}u;

int main()
{
    u.a=0x1234;
    if(0x34 == u.c)
    {
        printf("The machine is little-end.\n");
    }
    else if(0x12 == u.c)
    {
        printf("The machine is big-end.\n");
    }
    return 0;
}