C++整数溢出的问题

风空 2018-12-06 10:04:02
查看如下的代码:

#include <iostream>
#include<memory>
#include<string>
#include <limits>

using namespace std;
long long int f2();

int main()
{
cout << "Hello world!" << endl;
cout<<f2()<<endl;
return 0;
}

long long int f2()
{
int i = 2147483647;
int j = 2147483647;
return i+j;
}


输出的结果是 -2

为什么int + int 返回long long int 会溢出?
...全文
1111 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2019-01-23
  • 打赏
  • 举报
回复
引用 5 楼 zwfgdlc 的回复:
32位的程序返回值是存放在EAX寄存器里的,EAX寄存器只有32位跟int是一样的宽度,所以肯定会溢出,除非你把程序编译为64位的,这样返回值存放在RAX寄存器就不会溢出了
超过32位使用 edx:eax 返回哦
赵4老师 2019-01-23
  • 打赏
  • 举报
回复
天外怪魔 2019-01-21
  • 打赏
  • 举报
回复
long long int f2() { long long int i = 2147483647; long long int j = 2147483647; return i+j; }
棉猴 2019-01-21
  • 打赏
  • 举报
回复
《C++Primer第五版中文版》中提到,函数中,使用return返回某个值时,其实是把该值赋值给一个临时变量,之后函数返回该临时变量。

而在f2()函数中,表达式x+y的值是int,即此时x+y表达式的值已经是溢出后的值-2,f2()函数再把-2赋值给临时变量,最后返回该临时变量-2。所以,溢出与否和f2()函数返回值的类型无关
解决的方法是考虑使用算数转换(arithmetic conversion),在《C++Primer第五版中文版》中提到,在计算表达式时,运算符的运算对象将转换为最宽的类型。

所以可以考虑把f2()函数中x+y表达式中加法运算符的两个变量x或者y的类型改为long long
long long i = 2147483647;

此时,使用算术转换,y的类型转换为long long,即x+y的类型转换为long long,下图为修改后的输出
EasonDongH 2019-01-20
  • 打赏
  • 举报
回复
应该是在int+int的时候已经出现溢出,返回long long int只不过是对溢出的值进行了一次强制类型转换而已。
每天学一点! 2018-12-06
  • 打赏
  • 举报
回复
我的理解是 两个int数相加,加的时候并不会转成long long。long long只是将右边相加的结果转成long

而如果
double a = 3;
int b = 4;
double c = a + b; 这个时候在执行a+b的时候,由于double比int高,所以b先转成double,然后再相加。最后将double结果赋值给double类型。
bravery36 2018-12-06
  • 打赏
  • 举报
回复
int + int = int, 这个时候已经溢出了, 然后才转成 long long.
一般的可以这样
return (long long int)i + j;
就是将其中一个类型升级.
AlbertS 2018-12-06
  • 打赏
  • 举报
回复
加的过程已经溢出了吧
smwhotjay 2018-12-06
  • 打赏
  • 举报
回复
int+int=int
申请个longlong ret=a+b;
zwfgdlc 2018-12-06
  • 打赏
  • 举报
回复
32位的程序返回值是存放在EAX寄存器里的,EAX寄存器只有32位跟int是一样的宽度,所以肯定会溢出,除非你把程序编译为64位的,这样返回值存放在RAX寄存器就不会溢出了
  • 打赏
  • 举报
回复
看汇编代码就明白了。
赵4老师 2018-12-06
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧