是否有一个标准的(或 MSVC 专有的)typedef 可以包含 size_t 值的全部范围?即在 64 位系统上,它将是一个 128 位有符号整数。 原文由 japreiss 发布,翻译遵循 CC BY-SA 4.0 许可协议
一般来说,定义这样的类型是不可能的。实现使 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 许可协议
一般来说,定义这样的类型是不可能的。实现使
size_t
成为最大支持的无符号类型是完全合法的,这将(几乎可以肯定)意味着没有符号类型可以保存其所有值。ptrdiff_t
不一定足够宽。这是两个指针相减的结果,但没有什么说指针减法不会溢出。请参阅 C++ 标准的第 5.7 节:最大的有符号类型是
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-”的二进制定义,它们的有效性值得怀疑。)