为什么 stoi, stol 不是固定宽度的整数?
Why are stoi, stol not fixed width integers?
既然 ints 和 longs 以及其他整数类型在不同的系统上可能有不同的大小,为什么不用 stouint8_t()
、stoint64_t()
等,这样就可以编写可移植的字符串到 int 的代码?
因为通常不需要。
stoll
和 stoull
return 类型的结果分别为 long long
和 unsigned long long
。如果要将字符串转换为 int64_t
,只需调用 stoll()
并将结果存储在 int64_t
对象中即可;该值将被隐式转换。
这假定 long long
是最宽的有符号整数类型。与 C(从 C99 开始)一样,C++ 允许 扩展整数类型 ,其中一些可能比 [unsigned] long long
更宽。 C在<inttypes.h>
中提供了转换函数strtoimax
和strtoumax
(分别对intmax_t
和uintmax_t
进行操作)。无论出于何种原因,C++ 都不为此函数提供包装器(逻辑名称为 stoimax
和 stoumax
.
但这并不重要,除非您使用的 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";
}
因为打字会让我想砍掉我的手指。
说真的,基本的整数类型是 int
和 long
,std::stoX
函数只是 strtol
等的非常简单的包装器,请注意 C 没有不提供 strtoi32
或 strtoi64
或 std::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?"的回答是没有人提出。
既然 ints 和 longs 以及其他整数类型在不同的系统上可能有不同的大小,为什么不用 stouint8_t()
、stoint64_t()
等,这样就可以编写可移植的字符串到 int 的代码?
因为通常不需要。
stoll
和 stoull
return 类型的结果分别为 long long
和 unsigned long long
。如果要将字符串转换为 int64_t
,只需调用 stoll()
并将结果存储在 int64_t
对象中即可;该值将被隐式转换。
这假定 long long
是最宽的有符号整数类型。与 C(从 C99 开始)一样,C++ 允许 扩展整数类型 ,其中一些可能比 [unsigned] long long
更宽。 C在<inttypes.h>
中提供了转换函数strtoimax
和strtoumax
(分别对intmax_t
和uintmax_t
进行操作)。无论出于何种原因,C++ 都不为此函数提供包装器(逻辑名称为 stoimax
和 stoumax
.
但这并不重要,除非您使用的 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";
}
因为打字会让我想砍掉我的手指。
说真的,基本的整数类型是 int
和 long
,std::stoX
函数只是 strtol
等的非常简单的包装器,请注意 C 没有不提供 strtoi32
或 strtoi64
或 std::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?"的回答是没有人提出。