为什么 stoi、stol 不是固定宽度的整数
Why are stoi, stol not fixed width integers?
既然整数和长整型以及其他整数类型在不同的系统上可能有不同的大小,为什么不stouint8_t()
、stoint64_t()
等,以便可以编写可移植的字符串到整数代码呢?
因为打字会让我想砍掉我的手指。
说真的,基本的整数类型是int
和long
,std::stoX
函数只是围绕strtol
等的非常简单的包装器,请注意,C 不提供strtoi32
或strtoi64
或任何std::stouint32_t
可以包装的东西。
如果你想要更复杂的东西,你可以自己写。
我也可以问"为什么人们使用int
和long
,而不是到处int32_t
和int64_t
,所以代码是可移植的?"答案是因为它并不总是必要的。
但实际原因可能是没有人提出过它作为标准。事情不只是神奇地出现在标准中,必须有人写一份提案并证明添加它们的合理性,并说服委员会的其他成员添加它们。所以大多数"为什么我刚刚想到的这个东西不在标准中? 是没有人提出来的。
因为它通常不是必需的。
stoll
和 stoull
分别返回类型 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
。
但这并不重要,除非您使用提供比[unsigned] long long
更广泛的扩展整数类型的C++编译器,并且我不知道任何此类编译器实际上存在。对于宽度不超过 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";
}
- 如何检查是否定义了固定宽度的整数
- 当我尝试将范围值存储为 8 位的固定宽度整数时,它向我显示一些其他值 [ASCII]
- 是否有缺少固定宽度类型(intXX_t)的平台
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 使用固定宽度整数时,C 98 pedtical错误
- 为什么固定宽度类型会委托回基元
- 有没有理由不使用固定宽度类型
- 如何在 Windows 窗体应用程序 (C++) 中使用固定宽度整数
- iomanip /固定宽度持久性
- 为什么 std::setprecision(6) 在固定宽度模式式传输超过 6 位数字
- 在 STL 中使用 void* 作为固定宽度记录
- 删除浮点数上的科学记数法,而不强制固定宽度
- 为什么 stoi、stol 不是固定宽度的整数
- C++/Qt 中的精确宽度整数:typedef int qint32 真的正确吗?
- 获取固定大小整数的时间
- 在标准C++中是否存在固定宽度的布尔类型
- 如何使用cout设置固定宽度
- 固定宽度整数类型 std::uint8_t 和 std::int8_t 的实现,C++
- 固定宽度整数类型是否保证是标准内置类型的typedefs
- 为什么固定宽度的整数输出的是字符而不是整型?