c - 使用类型双关和填充位检测字节顺序

标签 c padding endianness

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

相关文章:

css - 添加 margin-left :10px; 后文本被推离屏幕

c++ - 从uint32_t读取位

C# BinaryWriter - 和字节顺序

c# - 如何模拟 BitConverter.IsLittleEndian 与我的单元测试相反的环境?

c - C 中无效的语句

C: 使用 nftw 指定最大搜索深度

c - c中用0初始化数组

c - 如何在c中创建一个双向链表

html - 链接图像的 html 列表中不需要的填充或间隙

CSS 在标题下方获取段落