加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的字节序宏

发布时间:2020-12-16 10:01:30 所属栏目:百科 来源:网络整理
导读:我最近在C中看到了关于字节序宏的这个 post,我无法真正地围绕第一个答案. Code supporting arbitrary byte orders,ready to be put into a file called order32.h: #ifndef ORDER32_H#define ORDER32_H#include limits.h#include stdint.h#if CHAR_BIT != 8#
我最近在C中看到了关于字节序宏的这个 post,我无法真正地围绕第一个答案.

Code supporting arbitrary byte orders,ready to be put into a file
called 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

You would check for little endian systems via

O32_HOST_ORDER == O32_LITTLE_ENDIAN

我确实理解一般的字节顺序.这就是我理解代码的方式:

>创建小,中,大字节序的示例.
>将测试用例与little,middle和big endianness的示例进行比较,并确定主机的类型.

我不明白的是以下几个方面:

>为什么工会需要存储测试用例? uint32_t是否保证能够根据需要保存32位/ 4字节?赋值{{0,3}}是什么意思?它为联合分配值,但为什么奇怪的标记有两个括号?
>为什么检查CHAR_BIT?一条评论提到检查UINT8_MAX会更有用吗?为什么char甚至在这里使用,当它不能保证是8位宽?为什么不使用uint8_t?我发现this链接到Google-Devs github.他们不依赖这个检查……有人可以详细说明吗?

解决方法

为什么工会需要存储测试用例?

测试的整个要点是使用数组将创建的魔术值对数组进行别名.

uint32_t是否保证能够根据需要保存32位/ 4字节?

好吧,或多或少.除了32位之外,没有任何保证.它只会在你永远不会遇到的一些真正的边缘建筑上失败.

赋值{{0,但为什么奇怪的标记有两个括号?

内支架用于阵列.

为什么检查CHAR_BIT?

因为这是实际的保证.如果这不会爆炸,一切都会奏效.

一条评论提到检查UINT8_MAX会更有用吗?为什么char甚至在这里使用,当它不能保证是8位宽?

因为事实上它总是如此.

为什么不使用uint8_t?我找到了Google-Devs github的链接.他们不依赖这个检查……有人可以详细说明吗?

许多其他选择也会起作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读