为什么 stoi, stol 不是固定宽度的整数?

Why are stoi, stol not fixed width integers?

既然 ints 和 longs 以及其他整数类型在不同的系统上可能有不同的大小,为什么不用 stouint8_t()stoint64_t() 等,这样就可以编写可移植的字符串到 int 的代码?

因为通常不需要。

stollstoull return 类型的结果分别为 long longunsigned long long。如果要将字符串转换为 int64_t,只需调用 stoll() 并将结果存储在 int64_t 对象中即可;该值将被隐式转换。

这假定 long long 是最宽的有符号整数类型。与 C(从 C99 开始)一样,C++ 允许 扩展整数类型 ,其中一些可能比 [unsigned] long long 更宽。 C在<inttypes.h>中提供了转换函数strtoimaxstrtoumax(分别对intmax_tuintmax_t进行操作)。无论出于何种原因,C++ 都不为此函数提供包装器(逻辑名称为 stoimaxstoumax.

但这并不重要,除非您使用的 C++ 编译器提供比 [unsigned] long long 更宽的扩展整数类型,而且我不知道是否存在任何此类编译器。对于任何不超过 64 位的类型,现有的函数就是您所需要的。

例如:

#include <iostream>
#include <string>
#include <cstdint>

int main() {
    const char *s = "0xdeadbeeffeedface";
    uint64_t u = std::stoull(s, NULL, 0);
    std::cout << u << "\n";

}

因为打字会让我想砍掉我的手指。

说真的,基本的整数类型是 intlongstd::stoX 函数只是 strtol 等的非常简单的包装器,请注意 C 没有不提供 strtoi32strtoi64std::stouint32_t 可以包装的任何内容。

如果你想要更复杂的东西,你可以自己写。

我也可以问 "why do people use int and long, instead of int32_t and int64_t everywhere, so the code is portable?",答案是因为这并不总是必要的。

但真正的原因可能是从来没有人提出过标准。事情不会神奇地出现在标准中,必须有人写一份提案并证明添加它们的理由,并说服委员会的其他成员添加它们。所以大多数"why isn't this thing I just thought of in the standard?"的回答是没有人提出。