字节顺序,又称端序或尾序。在计算机科学领域中,是跨多字节的程序对象的存储规则。参考链接字节顺序 字节排序
在代码中如何判断各系统采用大端方式还是小端方式呢,除了上面链接我之前的判断外,另一种方法如下:

#include <stdio.h>
#include <string.h>
union u_tag
{
    short  s;
    char   c[sizeof(short)];
}un;

int main(int argc, const char * argv[])
{
    un.s = 0x0102;
    //打印数组c中地址关系
    printf("%p  %p\n",&un.c[0],&un.c[1]);
    if (sizeof(short) == 2) {
        if (un.c[0] == 1 && un.c[1] == 2)
            printf("big-endian\n");
        else if (un.c[0] == 2 && un.c[1] == 1)
            printf("little-endian\n");
        else
            printf("unknown\n");
    }
    else
    {
        printf("sizeof(short) = %lu\n", sizeof(short));
    }
    
    return 0;

}

UNP中给出的实现,在一个短整型变量中存放2个字节的值0x0102,然后查看它的两个连续字节c[0] c[1],用以确定字节序。

联合 union

像结构一样,联合union也是由一个或多个成员构成的,而且这些成员可能具有不同的数据类型。但是,编译器只为联合中最大的成员分配足够的内存空间。联合的成员在这个空间内彼此覆盖。这样的结果是,给一个成员赋予新值也会改变所有其它成员的值。
为了说明联合的基本性质,现在声明一个联合变量u,且这个联合变量有两个成员:

union {
    int i;
    float f;
}u;

联合的声明方式非常类似于结构的声明方式:

struct {
    int i;
    float f;
}s;

事实上,结构变量s和联合变量u只有一处不同:s的成员都是存储在不同的内存地址中,而u的成员都是存储在同一内存地址中。下面时s和u在内存中的存储情况(为了画图方便, 假设int类型的值占用2个字节内存,而float类型的值占用4个字节内存);
在变量s的结构中,成员i和f占有不同的内存单元。s总共占用了6个字节的内存单元(不考虑内存对齐等因素)。在变量u的联合中,成员i和f互相重叠,所以u只占用了4个字节的内存单元,如图所示:

联合的初始化的方式与结构的不同点是,只有联合的第一个成员可以获得初始值。例如,可以用下列方式初始化联合u的成员i为0;
注意即使初始化是单独的一个表达式,也要保证大括号的存在。大括号的表达式必须是常量。

union {
    int i;
    float f;
}u={0};

更多关于字节序的介绍可以参考
字节序