4

这是用于在运行时检测字节序的常用技巧,例如在C FAQ中可以看到:

int x = 1;

if (*(char *)&x == 1)
{
  /* little-endian */
}
else
{
  /* big-endian */
}

根据我对标准的阅读,它不会导致未定义的行为,因为它不会违反严格的别名规则。

无论如何,只要整数类型除了unsigned char可以包含填充位(例如x),*(char *)x == 1即使它是一个小端系统,条件也不会出错吗?

在这种情况下,工会的解决方案是否更适合这样做?

4

1 回答 1

4

当你有填充位时,我不确定字节序是否真的有意义,但否则你是对的,条件可能是错误的。至少您没有调用未定义的行为,因为字符类型没有陷阱表示。

否则,您可以做的是使用精确宽度的整数类型(例如uint32_t等)。尽管这些类型是可选的,但它们保证没有填充位。

有关信息,请注意signed char也不能有填充位。

于 2013-01-11T18:00:26.100 回答