C++ std::stoul 不抛出异常
C++ std::stoul not throwing exception
我有一个函数可以检查字符串是否有效 unsigned int
:
unsigned long int getNum(std::string s, int base)
{
unsigned int n;
try
{
n = std::stoul(s, nullptr, base);
std::cout << errno << '\n';
if (errno != 0)
{
std::cout << "ERROR" << '\n';
}
}
catch (std::exception & e)
{
throw std::invalid_argument("Value is too big");
}
return n;
}
然而,当我输入一个值如 0xfffffffff
(9 f's) 时,errno
仍然是 0(并且没有抛出异常)。为什么会这样?
让我们看看在 64 位机器上将 0xfffffffff
(9 个 f)分配给 unsigned int
时会发生什么。
#include <iostream>
int main(){
unsigned int n = 0xfffffffff; //decimal value 68719476735
std::cout << n << '\n';
}
隐式转换会导致编译器发出警告,但不会导致异常。
stoul
的结果类型是unsigned long
,在64位机器上足够容纳0xfffffffff
,所以不会有异常。
我有一个函数可以检查字符串是否有效 unsigned int
:
unsigned long int getNum(std::string s, int base)
{
unsigned int n;
try
{
n = std::stoul(s, nullptr, base);
std::cout << errno << '\n';
if (errno != 0)
{
std::cout << "ERROR" << '\n';
}
}
catch (std::exception & e)
{
throw std::invalid_argument("Value is too big");
}
return n;
}
然而,当我输入一个值如 0xfffffffff
(9 f's) 时,errno
仍然是 0(并且没有抛出异常)。为什么会这样?
让我们看看在 64 位机器上将 0xfffffffff
(9 个 f)分配给 unsigned int
时会发生什么。
#include <iostream>
int main(){
unsigned int n = 0xfffffffff; //decimal value 68719476735
std::cout << n << '\n';
}
隐式转换会导致编译器发出警告,但不会导致异常。
stoul
的结果类型是unsigned long
,在64位机器上足够容纳0xfffffffff
,所以不会有异常。