错误经验一:计算两个整数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;
}
相关推荐
Legendary_0084 小时前
LDR6500:USB‑C DRP PD协议芯片技术详解与应用实践
c语言·开发语言
德思特4 小时前
德思特新品 | 双小区5G NR基站模拟器正式推出,支持从单点验证迈向网络级测试
经验分享·无线通信·射频微波
suuijbd5 小时前
某小厂Java开发面经
经验分享
dgaf7 小时前
DX12 快速教程(17) —— 立体图标与合并渲染
c语言·c++·3d·图形渲染·d3d12
念恒123068 小时前
进程控制---自定义Shell
linux·c语言
jikemaoshiyanshi9 小时前
如何选择防护面罩?告别国内品牌单纯对比,回归工业呼吸防护体系本质
经验分享·健康医疗
W.W.H.9 小时前
嵌入式系统硬件接口全景图
经验分享·uart·iic·gpio·spi
怪兽软家9 小时前
EndNote 2025 (2025.3)中文版安装教程及下载
经验分享·生活
程序员JerrySUN9 小时前
Jetson边缘嵌入式实战课程第二讲:JetPack 和 SDK Manager 是什么
c语言·开发语言·网络·udp·音视频
我不是懒洋洋10 小时前
布谷鸟过滤器:比布隆过滤器更优雅的判重方案
c语言·经验分享