当前位置: 首页 > news >正文

错误经验一:计算两个整数a和b的和

        这是一个测试平台上面的题目,我编译了好多次都出现同样的错误,一直在找啊找,终于发现了错误的根源!

题目:

最初的代码:

#第一次错误
#include<stdio.h>
int main(){int a,b;while(scanf("%d %d",&a,&b)!=EOF){printf("%d",a+b);}
}#第二次错误
#include<stdio.h>
int main(){int a,b;while(scanf("%d %d",&a,&b)!=EOF){long long sum=(long long)(a+b);printf("%lld",sum);}
}

测试不通过:

错误原因:溢出!

        a和b都是int型,若直接将b加到a里,然后再强制类型转换,实际上在b加到a里这一步就已经发生了溢出。

        看如下的汇编代码:不提前把寄存器扩大,把b加到寄存器上,因此就溢出了。

section .dataa dd 10       ; 假设 a = 10b dd 20       ; 假设 b = 20sum dd 0      ; 初始化 sum 为 0section .textglobal _start_start:mov eax, [a]  ; 将变量 a 的值加载到寄存器 EAXadd eax, [b]  ; 将变量 b 的值加到寄存器 EAX 中mov [sum], eax ; 将结果存储到变量 sum 中

  改进代码:

//正确代码一:
#include<stdio.h>
int main(){int a,b;while(scanf("%d %d",&a,&b)!=EOF){ long long sum=a;sum+=b;printf("%lld\n",sum);}return 0;
}//正确代码二:
#include<stdio.h>
int main(){long long a,b;while(scanf("%lld %lld",&a,&b)!=EOF){ printf("%lld\n",a+b);}return 0;
}

 

http://www.dtcms.com/a/285151.html

相关文章:

  • Paimon 动态分桶
  • 如何优雅处理 Flowable 工作流的 TaskAlreadyClaimedException?
  • SpringBoot02-application配置文件
  • 行业研究 | 2025金融可观测性实践与趋势洞察报告重磅发布!
  • 数据结构自学Day9: 二叉树的遍历
  • 克鲁斯焊接机器人保护气省气方案
  • JS - - - - - 数组乱序排序「进阶版」
  • c++:类型转换函数
  • mongodb-org-mongos : Depends: libssl1.1 (>= 1.1.1) but it is not installable
  • 基于LSTM的机场天气分析及模型预测
  • .NET Core EFCore零基础快速入门简单使用
  • 微信远程控制系统2.0
  • 二叉树的总结
  • mysql 字符集不一致导致索引失效问题
  • 为何“白名单媒体”是性价比之选?
  • 2025年视频超高清技术应用全景介绍
  • CSS Grid布局:构建现代网页的强大网格系统
  • Doris 物化视图:原理、使用及常见问题处理
  • Python类型转换,深浅拷贝
  • python的旧时光咖啡厅数据分析管理系统
  • 深入解析Linux进程创建与fork机制
  • Dify:在MacOS系统下Dify的本地部署与使用
  • Android Jetpack 系列(四)DataStore 全面解析与实践
  • RSTP:快速收敛的生成树技术
  • 深入解析SVM:从对偶问题求解到核函数理论
  • [3-03-01].第61节:开发应用 - Seata中的SAGA模式
  • 防止电脑息屏 html
  • Bell不等式赋能机器学习:微算法科技MLGO一种基于量子纠缠的监督量子分类器训练算法技术
  • Java 8 jdk1.8下载及安装教程和环境变量配置
  • 电子电路中的电压符号命名约定