这是用于在运行时检测字节序的常用技巧,例如在 C FAQ 中看到的:
int x = 1;
if (*(char *)&x == 1)
{
/* little-endian */
}
else
{
/* big-endian */
}
根据我对标准的阅读,它不会导致未定义的行为,因为它没有违反严格的别名规则。
无论如何,只要
unsigned char
以外的整数类型可以包含填充位(例如 x
),那么条件 *(char *)x == 1
不会是错误的,即使它是一个小端系统?在这种情况下, union 的解决方案是否更适合这样做?
最佳答案
当你有填充位时,我不确定字节序是否真的有意义,但否则你是对的,条件可能是错误的。至少您没有调用未定义的行为,因为字符类型没有陷阱表示。
否则你可以做的是使用精确宽度的整数类型(如 uint32_t
等)。尽管这些类型是可选的,但它们保证没有填充位。
有关信息,请注意 signed char
也不能有填充位。
关于c - 使用类型双关和填充位检测字节序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14283716/