我最近看到了这篇关于C语言中字节序宏的帖子,但是第一个答案让我有些难以理解。
支持任意字节序的代码,可以被放进一个名为order32.h的文件中:
#ifndef ORDER32_H
#define ORDER32_H
#include <limits.h>
#include <stdint.h>
#if CHAR_BIT != 8
#error "unsupported char size"
#endif
enum
{
O32_LITTLE_ENDIAN = 0x03020100ul,
O32_BIG_ENDIAN = 0x00010203ul,
O32_PDP_ENDIAN = 0x01000302ul
};
static const union { unsigned char bytes[4]; uint32_t value; } o32_host_order =
{ { 0, 1, 2, 3 } };
#define O32_HOST_ORDER (o32_host_order.value)
#endif
您可以通过以下方式检查小端系统: 我了解字节序的一般概念。这是我对代码的理解:
1. 创建小端、中间端和大端的示例。 2. 将测试用例与小端、中端和大端的示例进行比较,并决定主机机器的类型。
我不明白以下几个方面:
1. 为什么需要联合存储测试用例?不能保证能够像需要的那样容纳32位/4字节吗?赋值{ { 0, 1, 2, 3 } }的含义是什么?它将值分配给联合,但为什么要用两个大括号的“奇怪”的标记? 2. 为什么要检查CHAR_BIT?一个评论提到检查UINT8_MAX会更有用?char在这里为什么要使用,因为它不能保证是8位宽的?为什么不直接使用uint8_t?我找到了Google-Devs github的链接。他们没有依赖于此检查...请问有人能详细说明吗?
uint32_t
进行寻址后测试字节序。实际上,当我尝试使用宏032_HOST_ORDER时,确实会出现错误。error: invalid suffix '_HOST_ORDER' on integer constant.
你有什么想法吗?这里发生了什么? - LastSecondsToLive