【发布时间】:2021-09-17 09:51:54
【问题描述】:
我不明白为什么我的代码仍在打印 int 值(已溢出),而我想要 unsigned long 价值观!
这是我的代码:
#include <stdio.h>
unsigned long factorial(int num) {
if ((num == 0) || (num == 1 )) {
return 1;
} else if (num < 0) {
return 0;
} else {
return num * factorial(num - 1);
}
}
int main(void) {
int num;
char liste;
printf("Choisir un nombre pour trouver son factoriel : ");
//Translation : "Choose a number to find its factorial" ????
scanf("%d", &num);
printf("factoriel de %d : %lu\n", num, factorial(num));
}
这是一个返回阶乘值的非常基本的代码,但我只是一个初学者。
【问题讨论】:
-
您能否提供说明问题的输入(和相应的输出)示例?
-
请说明您的输入是什么,您期望什么输出以及您实际得到什么。
-
您已声明
factorial以返回unsigned long,但该函数和main中的所有其他内容都在int中处理。 -
如果你机器上的
long是32位的,你用有符号还是无符号都没有区别;你仍然会溢出。 12!需要 29 位,可以使用有符号或无符号 32 位类型。 13!需要 33 位,因此通常需要 64 位类型,可能是long long。 -
编辑问题以提供minimal reproducible example,包括程序失败的输入、观察到的输出,以及预期的输出(或至少将其与观察到的输出区分开来的描述) .此示例可能会阐明您的程序是否失败,是因为
unsigned long在您的 C 实现中只有 32 位,还是因为您的输入产生的阶乘对于 64 位数字来说太大了。
标签: c function integer printf long-integer