2016年7月8日 星期五

C語言 - Big-endian和Little-endian

1. 範例程式1
#include <stdio.h>

typedef union {
    long l;
    unsigned char c[4];
} Endian;

int main(int argc, char *argv[])
{
    Endian a;
    a.l = 0x12345678;

    if (a.c[0] == 0x78 && a.c[1] == 0x56 &&
        a.c[2] == 0x34 && a.c[3] == 0x12)
        printf("Little endian\n");
    else if (a.c[0] == 0x12 && a.c[1] == 0x34 &&
        a.c[2] == 0x56 && a.c[3] == 0x78)
        printf("Big endian\n");

    printf("a.l = 0x%lx\n", a.l);

    printf("%p: 0x%02x\n", &a.c[0], a.c[0]);
    printf("%p: 0x%02x\n", &a.c[1], a.c[1]);
    printf("%p: 0x%02x\n", &a.c[2], a.c[2]);
    printf("%p: 0x%02x\n", &a.c[3], a.c[3]);
    return 0;
}
執行結果:
Little endian
a.l = 0x12345678
0x7efd9634: 0x78
0x7efd9635: 0x56
0x7efd9636: 0x34
0x7efd9637: 0x12
Ex: long Data=0x12345678,寫到記憶體位址時。
- Big Endian,最高位元組在位址最低位元,最低位元組在位址最高位元,依次排列。

Address   Big-endian
-------------------------------------
0x0000    0x12
0x0001    0x34
0x0002    0x56
0x0003    0x78
-------------------------------------

- Little Endian,最低位元組在最低位元,最高位元組在最高位元,反序排列。
Address   Big-endian
-------------------------------------
0x0000    0x78
0x0001    0x56
0x0002    0x34
0x0003    0x12
-------------------------------------
2. 範例程式2
#include <stdio.h>

int main(int argc, char *argv[])
{
    unsigned int i = 0x00000001;
    char *c = (char *)&i;
 
    if (*c)
        printf("Little endian\n");
    else
        printf("Big endian\n");
 
    return 0;
}
整數宣告中,數值在記憶體中的排列
unsigned int i = 0x00000001;

Address    Big-endian    Little-endian
-------------------------------------
0x0000     0x00          0x01
0x0001     0x00          0x00
0x0002     0x00          0x00
0x0003     0x01          0x00
-------------------------------------


字元宣告中,數值在記憶體中的排列
char *c

Address    Big-endian    Little-endian
-------------------------------------
0x0000     0x00          0x01
-------------------------------------
3. 參考來源
https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F

沒有留言:

張貼留言