c - 下面是一个求一个数的阶乘的程序。为什么我得到 0 作为答案?我应该改用哪种数据类型?

标签 c gcc

我是 C 的新手。我编写了这个程序来查找任何数字的阶乘。执行程序后,当我提供 33 作为输入时 - 我得到 2147483648 作为答案。如果我提供 34,我会得到 0 作为答案。

开始我的问题 - 为什么我得到 0 作为答案?我使用的数据类型范围为 0-4294967295。我得到 0 是因为这超出了 unsigned int 的范围吗?如果我想得到一个大数字作为输出,我应该使用哪种数据类型?

使用的编译器 - GCC 8.2.1

这是代码 -

#include<stdio.h>
#include<stdlib.h>
int fact(unsigned int n)
{
        int result;
        if(n==0 || n==1)
                result=1;
        else
                result=n*fact(n-1);
        return result;
}
int main()
{
        unsigned int n,ans;
        printf("Enter n:");
        scanf("%u",&n);
        ans=fact(n);
        printf("Factorial of %u:%u",n,ans);
}

最佳答案

33! 实际上超出了 32 位 int 的范围,无论是有符号的还是无符号的。 12! 的值为 479001600,而 13! 的值为 6227020800,因此您超出了 13 的范围!

另请注意,result 被定义为 int,您从 fact 返回一个 int。这意味着您最终会遇到调用 undefined behavior 的有符号整数溢出。 .这可以通过将两者的类型更改为 unsigned 来解决,尽管您仍然限于 12!

您可以尝试为您的类型使用 unsigned long long。这将使您达到 20!。如果你想要比那个更大的值,你需要使用一个 bigint 库,比如 GMP。

关于c - 下面是一个求一个数的阶乘的程序。为什么我得到 0 作为答案?我应该改用哪种数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54907222/

相关文章:

gcc - 在 Windows 10 上安装 boost

c - 这两个语句有什么区别

c - 在管道中获取命令输出,C for Linux

c - C中使用消息队列的IPC机制

c - 常量表达式中的整数溢出

c - 在开关盒中将 int 与 int 数组的元素匹配

创建具有三个节点的链表

linux - 为什么 GCC(和其他工具)不遵循 GNU 命令选项约定准则?

python - Theano : MissingGxx , g++ 不可用

c++ - Itanium ABI 在多大程度上真正指定了填充和对齐?