code小白。。
代码在这里,64位编译环境。还是刚才那个阶乘。
#include<stdio.h>
int fac(int n);
int main(){
int num;
scanf("%d", &num);
while( num < 0) {
scanf("%d",&num);
}
printf("%d", fac(num));
return 0;
}
int fac(unsigned n){
int f;
if (n == 0) {
f = 1;
} else{
f = fac(n-1) * n;
}
return f;
}
https://github.com/SarishiNoH...
问题是在这段比较num和0的大小的时候
scanf("%d", &num);
while( num < 0) {
scanf("%d",&num);
}
想请教一下为什么在.compare这段中如果我把37行写成
cmpq $0, %rax
之后我每次输入负数的时候就会出现segment fault,
而%eax就可以正常运行,为啥?
rax和eax里面如果都是负数的话有什么区别吗?
首先,
RAX是64位的寄存器,EAX是32位的寄存器,他们的关系如下(别处copy来的):或者用16进制这么看
然而,C语言中
int是32bit,当你的数是正数的时候,RAX高位都是0,无影响,比如数字2000,即使是64位寄存器,存的也是2000但是,如果是负数,是采用补码的形式存储,那么首个二进制位必须是
1,比如数字-5首先看一下是怎么存储的
符号位以外的取反
所以最终
-5在EAX中是,但是如果你用RAX的话,高位都是0,那是正数啊!如果用了
RAX,这个是就不是-5而是4294967291了~不知道我算的对不对... 总之你用
int的话,肯定是用EAX的啦。