错误经验一:计算两个整数a和b的和
这是一个测试平台上面的题目,我编译了好多次都出现同样的错误,一直在找啊找,终于发现了错误的根源!
题目:
最初的代码:
#第一次错误
#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加到寄存器上,因此就溢出了。
section .dataa dd 10 ; 假设 a = 10b dd 20 ; 假设 b = 20sum dd 0 ; 初始化 sum 为 0section .textglobal _start_start:mov eax, [a] ; 将变量 a 的值加载到寄存器 EAXadd eax, [b] ; 将变量 b 的值加到寄存器 EAX 中mov [sum], eax ; 将结果存储到变量 sum 中
改进代码:
//正确代码一:
#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;
}