c – 用于端序测试和字节交换的联合hack

对于联合,写入一个成员并从其他成员(除了char数组)读取是UB.

//snippet 1(testing for endianess): 

union
{
    int  i;
    char c[sizeof(int)];
} x;

x.i = 1;                     // writing to i
if(x.c[0] == 1)              // reading from c[0]
{   printf("little-endian\n");
}
else
{   printf("big-endian\n");
}

//snippet 2(swap bytes using union):

int swapbytes()
{
    union                   // assuming 32bit, sizeof(int)==4
    {        
        int  i;
        char c[sizeof(int)];
    } x;
    x.i = 0x12345678;       // writing to member i
    SWAP(x.ch[0],x.ch[3]);  // writing to char array elements
    SWAP(x.ch[1],x.ch[2]);  // writing to char array elements
    return x.i;             // reading from x.i 
}   

代码段1是合法的C或C但不是代码段2.我是否正确?有人可以指向标准部分,它表示可以写入union的成员并从另一个成员读取char数组.

解决方法:

我相信它(片段1)在技术上是不允许的,但大多数编译器都允许它,因为人们使用这种代码. GCC甚至证明它受到支持.

你会在sizeof(int)== 1的某些机器上遇到问题,并且可能在某些既不是big endian也不是little endian的机器上会出现问题.

使用可将单词更改为正确顺序的可用函数,或使用配置宏设置此函数.无论如何,您可能需要识别编译器和操作系统.

上一篇:c-命名数组元素或联合中的结构和数组


下一篇:牛客练习赛32 A/B/C