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

Why are stoi, stol not fixed width integers?

本文关键字:固定宽度 整数 stoi stol 为什么      更新时间:2023-10-16

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

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

说真的,基本的整数类型是intlongstd::stoX函数只是围绕strtol等的非常简单的包装器,请注意,C 不提供strtoi32strtoi64或任何std::stouint32_t可以包装的东西。

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

我也可以问"为什么人们使用intlong,而不是到处int32_tint64_t,所以代码是可移植的?"答案是因为它并不总是必要的。

但实际原因可能是没有人提出过它作为标准。事情不只是神奇地出现在标准中,必须有人写一份提案并证明添加它们的合理性,并说服委员会的其他成员添加它们。所以大多数"为什么我刚刚想到的这个东西不在标准中? 是没有人提出来的。

因为它通常不是必需的。

stollstoull 分别返回类型 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

但这并不重要,除非您使用提供比[unsigned] long long更广泛的扩展整数类型的C++编译器,并且我不知道任何此类编译器实际上存在。对于宽度不超过 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";
}