这是一个测试平台上面的题目,我编译了好多次都出现同样的错误,一直在找啊找,终于发现了错误的根源!
题目:

最初的代码:
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;
}