为什么stoi,stol没有固定宽度整数?

时间:2015-01-09 01:19:47

标签: c++ c++11

由于int和long以及其他整数类型在不同系统上的大小可能不同,为什么不能使用stouint8_t()stoint64_t()等,以便可以编写可移植的字符串到int代码?

2 个答案:

答案 0 :(得分:7)

因为打字会让我想要切断我的手指。

说真的,基本的整数类型是intlong,而std::stoX函数只是围绕strtol等非常简单的包装器,并注意到C不是'提供strtoi32strtoi64std::stouint32_t可以包装的任何内容。

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

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

但实际原因可能是没有人提出标准。事情并不是神奇地出现在标准中,有人必须写一个提案并证明添加它们,并说服委员会的其他成员添加它们。所以大多数人的答案是“为什么我不会在标准中考虑过这个问题?"是没人提出来的。

答案 1 :(得分:5)

因为通常不需要

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

这假定long long是最宽的有符号整数类型。与C(从C99开始)一样,C ++允许扩展整数类型,其中一些可能比[unsigned] long long更宽。 C在strtoimax中提供转换函数strtoumaxintmax_t(分别在uintmax_t<inttypes.h>上运行)。无论出于何种原因,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";

}