【问题标题】:Safe way to get number of bytes for a data type in C++在 C++ 中获取数据类型的字节数的安全方法
【发布时间】:2020-11-20 12:09:42
【问题描述】:

我正在使用 C++11 及更高版本,我在问自己是否可以安全地获取像 std::uint16_t 这样的数据类型所需的字节数来发送长度不可知的协议。更准确地说,拨打sizeof(std::uint16_t) 是否安全,我可以假设这总是2吗? std::int16_t呢?

【问题讨论】:

  • 这正是sizeof 的用途,为什么不安全?
  • @Barmar 因为看到 eerorika 的回答。
  • 更好的是,static_assert(CHAR_BIT == 8); 并忘记它,因为您的代码不太可能在具有不同字节大小的机器上运行。

标签: c++ c++11 uint16


【解决方案1】:

在 C++ 中获取数据类型字节数的安全方法

那就是sizeof 运算符。

更准确地说,调用 sizeof(std::uint16_t) 是否安全,我可以假设这始终是 2 吗?

没有。当字节为 8 位时,您只能依赖它。

std::int16_t 呢?

一样。


对于网络通信,您可能需要知道一个类型有多少个八位字节。可以像这样安全地计算:sizeof(std::uint16_t) * (CHAR_BIT / 8),对于std::uint16_t,将为 2。请注意,并非所有系统都必须具有 std::uint16_t 类型。

【讨论】:

  • 根据定义一个字节不是总是8位吗?
  • @jjj 否。根据定义,一个字节是CHAR_BIT 位。有不同大小字节的 CPU。
  • @Ayxan 这在 C++ 中不可能发生:timsong-cpp.github.io/cppwp/support.types.layout#3
  • @Ayxan C 和 C++ 是不同的语言。这个 Q 被标记为 C++,所以 C 的答案可能不正确,在这种情况下,它们不是。
  • @SergeyA 我相信 IBM/360 系列机器就是这样一个例子,而且还有其他例子。
猜你喜欢
  • 1970-01-01
  • 2010-10-11
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多