typedef 用于可以包含 size_t 的有符号类型?

新手上路,请多包涵

是否有一个标准的(或 MSVC 专有的)typedef 可以包含 size_t 值的全部范围?即在 64 位系统上,它将是一个 128 位有符号整数。

原文由 japreiss 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 326
1 个回答

一般来说,定义这样的类型是不可能的。实现使 size_t 成为最大支持的无符号类型是完全合法的,这将(几乎可以肯定)意味着没有符号类型可以保存其所有值。

ptrdiff_t 不一定足够宽。这是两个指针相减的结果,但没有什么说指针减法不会溢出。请参阅 C++ 标准的第 5.7 节:

当两个指向同一个数组对象的元素的指针相减时,结果就是两个数组元素的下标之差。结果的类型是实现定义的有符号整数类型;此类型应与在 <cstddef> 标头 (18.2) 中定义为 std::ptrdiff_t 的类型相同。与任何其他算术溢出一样,如果结果不适合提供的空间,则行为未定义。

最大的有符号类型是 intmax_t ,定义在 <stdint.h><cstdint> 中。这是 C99 的一个特性,C++11 是第一个包含 C99 标准库的 C++ 标准,所以你的编译器可能不支持它(MSVC 很可能不支持)。 ( 9 年后:这不再是什么大问题了。 )如果有一个有符号类型足够宽以容纳 size_t 类型的所有可能值,那么 intmax_t 是(尽管 可能 有一个更窄的有符号类型也符合条件)。

您还可以使用 long long ,这是一种保证至少为 64 位的有符号类型(并且很可能与 intmax_t 相同)。即使它的宽度不足以容纳 size_t 类型的所有可能值,它几乎肯定会容纳 size_t 类型的所有 相关 值——除非您的实现实际上支持大于 8 艾字节的对象(即 8192 PB 或 8388608 TB)。

(注意,我使用的是“exa-”、“peta-”和“tera-”的二进制定义,它们的有效性值得怀疑。)

原文由 Keith Thompson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题