由于int和long以及其他整数类型在不同系统上的大小可能不同,为什么不能使用stouint8_t()
,stoint64_t()
等,以便可以编写可移植的字符串到int代码?
答案 0 :(得分:7)
因为打字会让我想要切断我的手指。
说真的,基本的整数类型是int
和long
,而std::stoX
函数只是围绕strtol
等非常简单的包装器,并注意到C不是'提供strtoi32
或strtoi64
或std::stouint32_t
可以包装的任何内容。
如果你想要更复杂的东西,你可以自己写。
我还可以问"为什么人们使用int
和long
,而不是int32_t
和int64_t
,所以代码是可移植的? "答案是因为它并不总是必要的。
但实际原因可能是没有人提出标准。事情并不是神奇地出现在标准中,有人必须写一个提案并证明添加它们,并说服委员会的其他成员添加它们。所以大多数人的答案是“为什么我不会在标准中考虑过这个问题?"是没人提出来的。
答案 1 :(得分:5)
因为通常不需要
。 stoll
和stoull
分别返回long long
和unsigned long long
类型的结果。如果要将字符串转换为int64_t
,只需调用stoll()
并将结果存储在int64_t
对象中;该值将被隐式转换。
这假定long long
是最宽的有符号整数类型。与C(从C99开始)一样,C ++允许扩展整数类型,其中一些可能比[unsigned] long long
更宽。 C在strtoimax
中提供转换函数strtoumax
和intmax_t
(分别在uintmax_t
和<inttypes.h>
上运行)。无论出于何种原因,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";
}