大端法与小端法

小端法(little endian),就是将最有效字节放在前面

大端法(big endian),就是将最有效字节放在前面

小端法违反直觉,但是主流操作系统都用这个,平时我们用的都是小端法

大端法符合习惯,用于网络字节流

 

需要澄清:

1. 具体字节是顺序排列还是倒序排列,是就一个具体的数据内部而言的。也就是说,数据与数据之间永远都是顺序存放,大端小端不会影响数据以外的内容(比如字符对齐产生的多余空间)

2. 字符串永远都是顺序存放,因此具有更好的跨平台性

 

实验1:

#include <stdio.h>
#include <netinet/in.h>

int main()
{
    printf("little endian:\n");
    short n = 0x1234;
    for(int i = 0; i < sizeof(n); ++i){
        printf("%x\n", *((char*)&n + i));
    }
    printf("big endian:\n");
    n = htons(n); // 将一个小端表示的短整型转为大端表示
    for(int i = 0; i < sizeof(n); ++i){
        printf("%x\n", *((char*)&n + i));
    }
    return 0;
}

结果:

little endian:
34
12
big endian:
12
34

实验2:

#include <stdio.h>
#include <string.h>

struct node
{
    short s;
    int n;
} a;


int main()
{
    printf("sizeof(node) = %d\n", sizeof(a));
    memset(&a, 0, sizeof(a));
    a.s = 0x0123;
    a.n = 0x01234567;
    for(int i = 0; i < sizeof(a); ++i){
        printf("%02x\n", *((char*)&a+i));
    }
    return 0;
}

结果:

sizeof(node) = 8
23
01
00
00
67
45
23
01

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章