错误经验一:计算两个整数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;
}
相关推荐
星哥说事1 小时前
Rocky Linux 9 源码包安装php7
linux·经验分享
basketball6163 小时前
Linux C 进程基本操作
linux·运维·服务器·c语言·后端
草莓熊Lotso3 小时前
【LeetCode刷题指南】--数组串联,合并两个有序数组,删除有序数组中的重复项
c语言·数据结构·其他·刷题
平哥努力学习ing3 小时前
C语言内存函数
c语言·开发语言·算法
wenke00a4 小时前
C函数实现strcopy strcat strcmp strstr
c语言·前端
小xiao白6 小时前
不能使用枚举作为 宏定义的定义
c语言·ide·单片机·物联网
timing9949 小时前
浅探C语言的回调函数(Callback Function)
c语言·前端·javascript
2401_867021909 小时前
线程(三) linux 同步
linux·运维·服务器·c语言·c++
The Mr.Nobody12 小时前
高性能上位机界面设计范式:C#与C++/C开发调试无缝衔接
c语言·c++·c#