输入惩罚 - 编译器如何决定使用哪种类型?

Ton*_*ion 3 c++ unions type-punning

我在这里读到这个关于决定字节序的问题,第一个答案让我感到困惑.

用于决定大字节序的代码如下:

int is_big_endian(void)
{
    union {
        uint32_t i;
        char c[4];
    } bint = {0x01020304};

    return bint.c[0] == 1; 
} 
Run Code Online (Sandbox Code Playgroud)

我的问题是这里的编译器如何决定用于该十六进制数字数组类型?因为从技术上讲它同样适用于那个uint32_t或那个char[4].

为什么不把它存放在char[4]跳过union

这里有一些union我看不到的优势吗?我知道这被称为打字,但我没有看到它的优势.

Mik*_*our 6

我的问题是这里的编译器如何决定用于该十六进制数字数组的类型?

与数组和聚合类一样,第一个初始化器初始化第一个成员; 在这种情况下i.(当然,与那些东西不同,拥有多个初始化器是没有意义的).

为什么不将它存储在char [4]中并跳过联合?在这里,我看不到一个工会的优势吗?

这样做的目的是初始化4字节整数,然后使用该char数组检查各个字节以确定内存顺序.如果最重要的byte(0x01)存储在第一个字节中,那么系统是"big-endian"; 否则它是"小端"(或者可能是一些陌生人).