错误经验一:计算两个整数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;
}
相关推荐
子牙老师31 分钟前
从零手写gdb调试器
c语言·linux内核·gdb·调试器
小莞尔1 小时前
【51单片机】【protues仿真】基于51单片机主从串行通信系统
c语言·单片机·嵌入式硬件·物联网·51单片机
Hello_Embed2 小时前
STM32 环境监测项目笔记(一):DHT11 温湿度传感器原理与驱动实现
c语言·笔记·stm32·单片机·嵌入式软件
逐步前行3 小时前
C标准库--浮点<float.h>
c语言·开发语言
水饺编程4 小时前
第3章,[标签 Win32] :窗口类03,窗口过程函数字段
c语言·c++·windows·visual studio
雨落在了我的手上7 小时前
C语言入门(十):函数的深入认识
c语言
wangjialelele8 小时前
端口号、常见协议和套接字
linux·运维·服务器·c语言·网络
deng-c-f8 小时前
Linux C/C++ 学习日记(26):KCP协议(二):kcp源码分享
c语言·c++·学习·网络编程·kcp
雾岛听蓝8 小时前
深入解析内存中的整数与浮点数存储
c语言·经验分享·笔记·visualstudio
Yupureki8 小时前
从零开始的C++学习生活 9:stack_queue的入门使用和模板进阶
c语言·数据结构·c++·学习·visual studio