typedef是否可以包含size_t的签名类型?

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

一般来说,定义这种类型是不可能的。 对于一个实现来说,使size_t成为最大的受支持无符号类型是完全合法的,这意味着没有符号类型可以保存其所有值。

ptrdiff_t不一定足够宽。 这是减去两个指针的结果,但没有任何东西说指针减法不能溢出。 请参阅C ++标准的第5.7节:

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

最大的签名类型是intmax_t ,在 。 这是一个C99function,C ++ 11是第一个包含C99标准库的C ++标准,因此您的编译器可能不支持它(而MSVC很可能不支持)。 如果有一个足够宽的有符号类型来保存size_t类型的所有可能值,那么intmax_t就是(尽管可能有一个更窄的有符号类型也符合条件)。

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

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

我假设你需要这种类型的指针算法。 除了std::ptrdiff_t之外,你不太可能需要任何其他东西。 它将在现代机器上发挥作用的唯一情况是,当您处于32位模式并且您正在处理超过2 ^ 31字节的数据集时。 (如果没有特殊的工作,这在Windows上甚至是不可能的。)你将无法同时使用那个大小的两个数组。 在这种情况下,您应该可以在64位模式下工作。

在64位模式下,在目前的内存开发速度下,未来40年左右很可能不会出现问题。 当它成为问题时,然后在128位模式下编译代码,它将继续运行。 ;)

如果你想要一个可以包含系统最大值的标准类型,那么 (因为C ++ 11)可能有所帮助。

该头中有一个typedef,它包含最大宽度整数类型,类型为intmax_t 。 有符号整数的uintmax_t和无符号整数的uintmax_t是架构完全支持的最大整数。

所以,假设您使用的是64位架构,请遵循以下说明:

 std::cout << "intmax_t is same int64_t? " << (std::is_same::value ? "Yes" : "No"); 

将输出:

intmax_t与int64_t相同? 是

现场演示 。

希望能帮助到你。