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

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

题目:

最初的代码:

cpp 复制代码
#第一次错误
#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加到寄存器上,因此就溢出了。

cpp 复制代码
section .data
    a dd 10       ; 假设 a = 10
    b dd 20       ; 假设 b = 20
    sum dd 0      ; 初始化 sum 为 0

section .text
    global _start

_start:
    mov eax, [a]  ; 将变量 a 的值加载到寄存器 EAX
    add eax, [b]  ; 将变量 b 的值加到寄存器 EAX 中
    mov [sum], eax ; 将结果存储到变量 sum 中

改进代码:

cpp 复制代码
//正确代码一:
#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;
}
相关推荐
huangdong_1 分钟前
京东商品图片与视频采集技术深度解析:m3u8视频合并、SKU图提取
经验分享·音视频
J2虾虾1 小时前
C语言 typedef 用法
c语言·数据结构·算法
BomanGe11 小时前
NSK高刚性精密滚珠丝杠PFT4006详析
经验分享·规格说明书
xuhaoyu_cpp_java1 小时前
项目学习(三)代码生成器
java·经验分享·笔记·学习
WL学习笔记2 小时前
顺序表详解
c语言·数据结构
智者知已应修善业2 小时前
【51单片机初始化D5-D8亮,每按键按下D1到D4全亮,再按下恢复,如此循环】2024-3-26
c++·经验分享·笔记·算法·51单片机
c++之路3 小时前
CMake 系列教程(一):CMake 基础知识
c语言·开发语言·c++
我还记得那天3 小时前
C语言随机数生成机制与猜数字游戏实现
c语言·开发语言·游戏
高校网站建设群系统EduCMS4 小时前
网站群国产化改造升级服务公司,深圳信科网络科技
经验分享
万法若空4 小时前
C/C++基本类型表示范围
c语言·开发语言·c++