这是一个用于在运行时检测字节顺序的常用技巧,例如在 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/