c - 为什么我的查找 21 以内阶乘的 C 程序从 13 的阶乘开始产生无效结果?

标签 c

在计算 13 的阶乘的迭代中,它开始产生无效结果。我已经完全按照教科书中的方式输入了它,但是我得到的输出与书中列出的不同。我的编译器是 Dev C++,它设置为 C99 标准。编译器中是否有某些关闭的设置会导致 unsigned long long int 格式不正确或没有适当的最大值? 13岁!它打印出 1932053504。

#include <stdio.h>

//prototype for factorial function
unsigned long long int factorial(unsigned int number);

int main(void){
    unsigned int i; //counter for for-loop

    //during each iteration call factorial and print result
    for( i = 0; i <= 21; ++i){
        printf("%u! = %11u\n", i, factorial(i));
    }
}

unsigned long long int factorial(unsigned int number){
    if(number <= 1){
        return 1;
    }
else{ //recursive step
    return(number * factorial(number - 1));
    }
}

最佳答案

我认为您的说明符中有错字。我想你的意思是 ll 而不是 11。您正在将 unsigned long long 传递给它,因此它需要是

printf("%u! = %llu\n", i, factorial(i));

这是打开(并注意)编译器警告的另一个原因。我的编译器立即告诉我问题出在哪里。

test.c:11:35: warning: format specifies type 'unsigned int' but the argument has type 'unsigned long long' [-Wformat]
        printf("%u! = %11u\n", i, factorial(i));
                      ~~~~        ^~~~~~~~~~~~
                      %11llu
1 warning generated.

你得到的答案是未定义行为的结果,但你的机器是小端,有 32 位整数,13! = 6227020800 > 2^32 = 4294967296 和 6227020800 % 4294967296 = 1932053504 可能是您得到该答案的原因。

关于c - 为什么我的查找 21 以内阶乘的 C 程序从 13 的阶乘开始产生无效结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21820062/

相关文章:

使用 GCC 交叉编译 C 应用程序

c - 使用 strtok() 定界路径

c - 在C中显示所有十进制数

c - 切换位,但不将它们切换回来?

C: gettimeofday() 每次运行产生相同的值

c - 如何使用c编程获取linux上的内核数?

ios - 未缓存模块时,iOS 框架中的 C 静态库“无法构建 Objective-C 模块”

c# - 构建系统选择?

将颜色值从浮点 0..1 转换为字节 0..255

c - C代码中的数组归零