热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

'stol'使用VisualStudio但不是gcc抛出的异常-Exceptionthrownby'stol'usingVisualStudiobutnotgcc

ThefollowingcodethrowsanexceptionwhenitisrununderVisualStudio2013butnotgcc4.9.2.以下

The following code throws an exception when it is run under Visual Studio 2013 but not gcc 4.9.2.

以下代码在Visual Studio 2013下运行但不是gcc 4.9.2时抛出异常。

The error reported is:

报告的错误是:

'exception: stol argument out of range'

'例外:stol争论超出范围'

stol returns a long so the size of temp should be big enough to hold the returned value.

stol返回一个long,因此temp的大小应足够大以容纳返回的值。

Can anyone explain the behaviour. Is this possibly a compiler bug?

谁能解释这种行为。这可能是编译器错误吗?

#include 
#include 
#include 
#include 

int main()
{
    const std::string value = "4294967295";   // 0xffffffff

    try
    {
        int64_t temp = std::stol(value);
    }

    catch (std::invalid_argument& ex)
    {
        std::cout <<"invalid_argument: " <

5 个解决方案

#1


5  

Under Windows the type long is always 32-bits. Since long is a signed integer type this means that the range of long is between -2147483648 and 2147483647 inclusive. On Linux the size of long depends on whether you're compiling for 32-bits or 64-bits.

在Windows下,long类型总是32位。由于long是有符号整数类型,这意味着long的范围介于-2147483648和2147483647之间。在Linux上,long的大小取决于您是编译32位还是64位。

Since std:stol converts a string to long the result must fit into a long. If it doesn't then the function throws std::out_of_range. To resolve this problem you can use std::stoll which returns a long long, which is guaranteed to be at least 64-bits and so won't ever throw an exception when converting "4294967295". You can also use std::stoul, which converts to a unsigned long, which is is guaranteed to have a range of at least 0 to 4294967295.

由于std:stol将字符串转换为long,因此结果必须适合long。如果没有,则函数抛出std :: out_of_range。要解决此问题,您可以使用std :: stoll,它返回一个long long,保证至少为64位,因此在转换“4294967295”时不会抛出异常。你也可以使用std :: stoul,它转换为无符号长整数,保证其范围至少为0到4294967295。

(Note that this is not strictly a Visual C++ versus GCC thing. When targeting Windows, GCC also always uses a 32-bit long.)

(请注意,这不是严格意义上的Visual C ++与GCC的对比。当针对Windows时,GCC也总是使用32位长。)

#2


5  

My bet would be a 32 bits long on visual studio (max 2^31, so overflow) and a 64 bits long on GCC (so nowhere near overflow).

我的赌注是视觉工作室的32位长(最大2 ^ 31,因此溢出)和GCC上的64位长(因此无处接近溢出)。

#3


3  

Not a compiler bug, the problem is your invalid assumptions.

不是编译器错误,问题是你的无效假设。

The Standard allows LONG_MAX to be as low as 2147483647, so

标准允许LONG_MAX低至2147483647,所以

stol returns a long so the size of temp should be big enough to hold the value.

stol返回一个long,因此temp的大小应足够大以容纳该值。

simply is not true.

根本不是真的。

#4


1  

So just use std::stoul instead.

所以只需使用std :: stoul。

At first glance the string constant certainly exceeds the maximum value a long can assume, but not the max value an unsigned long can have...

乍一看,字符串常量肯定超过了long可以假设的最大值,但不是unsigned long可以具有的最大值...

#5


0  

From

http://en.cppreference.com/w/cpp/string/byte/strtol

strtol returns a long and you need strtoll to get a long long

strtol返回很长时间,你需要strtoll才能获得很长时间


推荐阅读
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 高级缩放示例.就像谷歌地图一样.它仅缩放图块,但不缩放整个图像.因此,缩放的瓷砖占据了恒定的记忆,并且不会为大型缩放图像调整大小的图像.对于简化的缩放示例lookhere.在Win ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 本文探讨了在UIScrollView上嵌入Webview时遇到的一个常见问题:点击图片放大并返回后,Webview无法立即滑动。我们将分析问题原因,并提供有效的解决方案。 ... [详细]
  • 本文详细介绍了HashSet类,它是Set接口的一个实现,底层使用哈希表(实际上是HashMap实例)。HashSet不保证元素的迭代顺序,并且是非线程安全的。 ... [详细]
  • 本文详细记录了 MIT 6.824 课程中 MapReduce 实验的开发过程,包括环境搭建、实验步骤和具体实现方法。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom&amp;quot;echarts&amp;quot;;4、如果用到map(地图),还 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • ### 优化后的摘要本文对 HDU ACM 1073 题目进行了详细解析,该题属于基础字符串处理范畴。通过分析题目要求,我们可以发现这是一道较为简单的题目。代码实现中使用了 C++ 语言,并定义了一个常量 `N` 用于字符串长度的限制。主要操作包括字符串的输入、处理和输出,具体步骤涉及字符数组的初始化和字符串的逆序操作。通过对该题目的深入探讨,读者可以更好地理解字符串处理的基本方法和技巧。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
author-avatar
书苑幽香
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有