错误经验一:计算两个整数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;
}
相关推荐
智者知已应修善业15 小时前
【51单片机LED闪烁10次数码管显示0-9】2023-12-14
c++·经验分享·笔记·算法·51单片机
智者知已应修善业15 小时前
【51单片机2按键控制1个敞亮LED灯闪烁和熄灭】2023-11-3
c++·经验分享·笔记·算法·51单片机
AI科技星16 小时前
第二章 平行素数对网格:矩形→等腰梯形拓扑变换(完整公理终稿)
c语言·开发语言·线性代数·算法·量子计算·agi
Biocloudy18 小时前
信号分子:从 CD8⁺ T 细胞到癌症免疫疗法
大数据·人工智能·经验分享·其他
社交怪人18 小时前
【歌手大奖赛】信息学奥赛一本通C语言解法(题号2072)
c语言·算法
Chen_harmony19 小时前
【习题02】打印菱形
c语言
优化控制仿真模型20 小时前
【26年社工】初级社会工作者历年真题及答案PDF电子版(2010-2025年)
经验分享·pdf
2501_9432050521 小时前
【202期】新版VMware虚拟机汉化包
经验分享
c-u-r-ry3021 小时前
vivado处理硬件设计差分对布线极性翻转的问题
经验分享·fpga开发
handler0121 小时前
【Linux 网络】一文读懂 HTTP 协议
linux·c语言·网络·c++·笔记·网络协议·http