Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 由';stol&x27;使用VisualStudio但不使用gcc_C++_C++11_Exception_Visual Studio 2013_Gcc4.9 - Fatal编程技术网

C++ 由';stol&x27;使用VisualStudio但不使用gcc

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() {

以下代码在Visual Studio 2013(而非gcc 4.9.2)下运行时引发异常

报告的错误是:

'异常:stol参数超出范围'

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)
如其他人所述。