【发布时间】:2021-10-19 07:21:09
【问题描述】:
对于大于 16 的数字,我对阶乘函数的表面实现通常会失败。
#include <stdio.h>
int fact(int x){
if (x==1)
return 1;
else
return (x* fact(x-1));
}
int main() {
int x;
scanf("%d", &x);
printf("%d\n", fact(x));
}
这是否取决于在递归的某个点,整数将无法根据sizeof(int) 表示?
【问题讨论】:
-
对于大于 16 的值,您期望什么结果?你的机器上整数的大小是多少?答案可能是你是对的,你的整数太小了。
-
这仅仅是因为
fact(16) > MAX_INT,MAX_INT = 2147483647-fact(16) = 20922789888000(来源:维基百科) -
C 中的所有类型都有范围限制。在大多数系统上,
int是有符号的 32 位整数类型,范围从大约负二十亿到正二十亿。如果您想要大于 20 亿的数字,那么使用int您将有 算术溢出,这会导致 未定义的行为。使用较大的类型,例如uint64_t(这是一个无符号的 64 位整数类型)(如果可用)。 -
@Some 程序员老兄,我相信
sizeof(int)依赖于编译器,通常是平台上最快的整数类型(用于整数运算)...所以如果你的编译器支持64位操作系统,那么它的大小应该是8字节。 -
@WENDYN 拥有 64 位系统并不意味着
int是 64 位。您还可以拥有 64 位指针和 32 位int。