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

10-11 21:20