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

C++ 为什么stoi,stol不是固定宽度的整数?,c++,c++11,C++,C++11,既然int和longs以及其他整数类型在不同的系统上可能大小不同,为什么不使用stouint8_t(),stoint64_t(),这样就可以将可移植字符串写入int代码?,因为这通常是不必要的 stoll和stoull分别返回类型为long和unsigned long的结果。如果要将字符串转换为int64\u t,只需调用stoll()并将结果存储在int64\u t对象中;该值将被隐式转换 这假定long是最宽的有符号整数类型。和C一样(从C99开始),C++允许扩展整数类型,其中一些可能比(

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

,因为这通常是不必要的

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

这假定
long
是最宽的有符号整数类型。和C一样(从C99开始),C++允许扩展整数类型,其中一些可能比(un签署)长Lo/<代码>更宽。C在
中提供转换函数
strotimax
strotumax
(分别在
intmax\t
uintmax\t
上操作)。无论出于何种原因,C++都不提供这个函数的包装(逻辑名称将是代码> StoIMAX < /代码>和<代码> StouxMax < /C> <>但是除非使用C++编译器,它提供了比(un签署)长Lo/<代码>更大的扩展整数类型,而且我不知道任何这样的编译器实际上存在。对于任何类型的不大于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 main(){
const char*s=“0xdeadbeeffeedface”;
uint64_t u=std::stoull(s,NULL,0);

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

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

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

我还可以问“为什么人们在任何地方都使用
int
long
,而不是
int32\t
int64\t
,所以代码是可移植的?”答案是因为它并不总是必要的


但实际原因可能是没有人为标准提出过。事情不仅仅是神奇地出现在标准中,还需要有人写一份提案,证明添加它们是合理的,并说服委员会的其他成员添加它们。因此,大多数人的答案是“为什么我没有在标准中想到这件事?”是noone提出的。

C++也支持
intmax\u t
,但没有提供
std::stoimax
包装,这与固定大小的整数类型本身一样必要。很抱歉,我不同意这种评估,即有时必要,有时需要not@LightnessRacesinOrbit想去吗明白为什么它们如此必要吗?如果一系列数字以某种分隔符(例如“123456789”)分隔打印出来,那么任何返回类型比打印源更宽的
strto*()
函数都将返回相同的内容。如果值未分隔打印出来(例如“123456789”),那么,任何人怎么能毫不含糊地解析它呢?比如说,解析成123456789,而不是123456789,0?@IwillnotexistIdonotexist:这不是关于模棱两可的解析。这是关于知道你正在解析成一个整数类型,这个整数类型对于一些已知的输入来说是正确的大小。我讨厌实现定义的宽度类型;它们对我来说毫无意义。O其中的一个缺点是没有固定宽度的整数类型是保证存在的。因此,您需要
stouint\u least8\u t()
stouint\u fast8\u t()
等等on@Praetorian一套
sto()
etc没有那么糟糕。你问题的标题似乎暗示你更喜欢只使用固定宽度整数的函数……这真的是你的意思吗,还是你在问为什么它们不存在?我更喜欢使用
boost::lexical\u cast
方法。模板函数专门用于所有基本算术类型es,则所有的固定宽度类型版本都随附,因为它们只是基本类型的typedef。添加
stoimax()
stoumax()
就足够了;不需要为每个
[u]都提供转换函数intN_t
types.@KeithThompson:是吗?那么你将依赖于函数的所有用法,将值放入某个大的
intmax
类型中,检查它是否符合他们想要使用的变量范围,并使用缩小转换。或者,人们可能只是放弃一个强制转换,而不进行缩小转换考虑到它们得到的值和字符串中的值是不同的……是的,我看到了这种情况,接着是问题,并抱怨C++使用的复杂性。
…但是
stoiX
的界面不是很好,如果你问我,为什么要扩展它?]