C++ 由';stol&x27;使用VisualStudio但不使用gcc
以下代码在Visual Studio 2013(而非gcc 4.9.2)下运行时引发异常 报告的错误是: '异常:stol参数超出范围'C++ 由';stol&x27;使用VisualStudio但不使用gcc,c++,c++11,exception,visual-studio-2013,gcc4.9,C++,C++11,Exception,Visual Studio 2013,Gcc4.9,以下代码在Visual Studio 2013(而非gcc 4.9.2)下运行时引发异常 报告的错误是: '异常:stol参数超出范围' stol返回一个long,因此temp的大小应该足够大,可以容纳返回的值 有人能解释一下这种行为吗。这可能是一个编译器错误吗 #include <iostream> #include <exception> #include <string> #include <stdexcept> int main() {
stol
返回一个long
,因此temp
的大小应该足够大,可以容纳返回的值
有人能解释一下这种行为吗。这可能是一个编译器错误吗
#include <iostream>
#include <exception>
#include <string>
#include <stdexcept>
int main()
{
const std::string value = "4294967295"; // 0xffffffff
try
{
int64_t temp = std::stol(value);
}
catch (std::invalid_argument& ex)
{
std::cout << "invalid_argument: " << ex.what() << "\n";
}
catch (std::exception& ex)
{
std::cout << "exception: " << ex.what() << "\n";
}
return 0;
}
#包括
#包括
#包括
#包括
int main()
{
const std::string value=“4294967295”;//0xFFFFFF
尝试
{
int64_t temp=std::stol(值);
}
catch(std::无效的_参数&ex)
{
std::cout我的赌注是visual studio上的32位长
(最大2^31,所以溢出),而GCC上的64位长
(所以远没有溢出)。
strtol返回一个long,您需要strtoll在Windows下获得long long,类型long
总是32位。由于long
是一个有符号整数类型,这意味着long
的范围介于-2147483648和2147483647之间(含)。在Linux上long
的大小取决于您是否编译g表示32位或64位
由于std:stol
将字符串转换为long
,因此结果必须适合long
。如果不适合,则该函数将失效。要解决此问题,可以使用std::stoll
返回long-long
,该值保证至少为64位,因此在转换时不会引发异常de>“4294967295”
。您也可以使用std::stoul
,它可以转换为无符号长字符
,保证其范围至少为0到4294967295
(注意这不是严格的VisualC++与GCC的东西。当针对Windows时,GCC也总是使用32位<代码>长< /COD>)。
< P>不是编译器错误,问题是你的无效假设。 该标准允许LONG_MAX
低至2147483647,因此
stol
返回一个long
,因此temp
的大小应该足够大,可以容纳该值
这根本不是真的。所以只需使用
std::stoul
乍一看,字符串常量肯定超过了
long
可以假定的最大值,但不是无符号long
可以具有的最大值…这可能是32位vs 64位的问题吗?(即在vs中编译为32位,在gcc中编译为64位?)是否尝试检查sizeof(long)
long
在Windows上是32位的,与32/64位VS编译器无关。@Praetorian但temp的大小是64位。@ksl这有什么关系?stol
返回long
。你可以看到Coliru g++的sizeof(long)
为8。这不一定是全部,真正的问题是sizeof(long)
如其他人所述。