【问题标题】:How can i use 6 byte integer data type in C?如何在 C 中使用 6 字节整数数据类型?
【发布时间】:2020-07-15 06:33:37
【问题描述】:

我想在 c 中使用 6 字节数据类型,但我找不到怎么做。你能教我如何在c中使用6字节整数数据类型吗?

我使用 dev c++ 和代码块。

我想使用 c,但我也可以使用 c++。 Windows 64 位

【问题讨论】:

标签: c++ c types integer custom-data-type


【解决方案1】:

有一种方法可以在 C 中为某些东西提供确切的位数,所以理论上它是可行的,但它需要超过 48 位的内存。

为此,您可以使用 C 中的位域,您可以:

struct your_type {
   uint64_t your_value : 48;
};

有了这个,你可以创建这样的结构,并访问你的值,它将有 48 位表示。它将被视为 uint64_t 在引擎盖下。

说我强烈建议阅读Ansi C 或任何其他基本的 C 书籍以更好地了解基础知识。

请注意,由于填充、打包和字节序问题,使用位域创建解析器通常是个坏主意。如果您需要任何协议,请关注 messagepack 或任何其他协议库。

【讨论】:

  • uint64_t 的位域能力依赖于实现 - 不是完全可移植的。 “位域的类型应为 _Bool, signed int, unsigned int 的合格或不合格版本,或其他一些实现定义的类型。”
【解决方案2】:

阅读 C11 标准 n1570 和 C++11 标准 n3337。

C 和 C++ 是不同的编程语言

另请参阅this C and C++ reference 网站。

还要阅读优秀的 C 编程书籍 (Modern C) 和优秀的 C++ programming book(以及编译器的文档)。

那里没有提到6字节整数。

(理论上奇怪的 C 或 C++ 实现除外;我无法说出 2020 年任何现有的实现)

您可以使用struct 中的位字段或(而不是)64 位数字 std::int64_t)结合位运算(例如按位和& 或按位或| 或按位不~ 或位移操作<< 或>>)

您可能会生成序列化例程,例如使用SWIG。当心endianness 问题。为了便于调试,您可能更喜欢 JSON 这样的文本格式,而不是发送二进制数据包。

48 位数字的典型示例是Ethernet frame MAC 地址。请参阅OSDEV wiki 中提到的示例代码。

【讨论】:

  • 不是反对者,这不是(还不是?)标准的一部分,但有N2472
  • @BasileStarynkevitch You could use bit fields in struct or 64 bit numbers std::int64_t) combined with bitwise operations (e.g. bitwise and & or bitwise or | or bitwise not ~ or bit shifts operations << or >>) 为什么要合并?位域的行为完全符合 OP 的要求,没有任何魔法。
  • 对不起。我不是以英语为母语的人。我添加了“代替”这个词。
  • int48 示例。
  • 是的,但在 C++11 中没有
猜你喜欢
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多