C++ 为什么stoi,stol不是固定宽度的整数?
既然int和longs以及其他整数类型在不同的系统上可能大小不同,为什么不使用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++允许扩展整数类型,其中一些可能比(
stouint8_t()
,stoint64_t()
,这样就可以将可移植字符串写入int代码?,因为这通常是不必要的
stoll
和stoull
分别返回类型为long
和unsigned long
的结果。如果要将字符串转换为int64\u t
,只需调用stoll()
并将结果存储在int64\u t
对象中;该值将被隐式转换
这假定long
是最宽的有符号整数类型。和C一样(从C99开始),C++允许扩展整数类型,其中一些可能比
中提供转换函数strotimax
和strotumax
(分别在intmax\t
和uintmax\t
上操作)。无论出于何种原因,C++都不提供这个函数的包装(逻辑名称将是代码> StoIMAX < /代码>和<代码> StouxMax < /C>
<>但是除非使用C++编译器,它提供了比#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
的界面不是很好,如果你问我,为什么要扩展它?]