尝试用 C 编写一个阶乘程序
try to make a factorial program in C
幸运的是,这个程序可以很好地找到 1 到 12 的阶乘,但是在 12 之后作为 13、14、20 ..... 输出出错,我也尝试找到 40 的阶乘,但输出为 0 .
找不到确切的问题...
#include <stdio.h>
int main() {
int user_input, tbl;
printf("Enter any number: \t");
scanf("%i", &user_input);
tbl = user_input;
for(int i=2; i < user_input; i++) {
tbl = tbl * i;
}
printf("Factorial of %i is %i", user_input, tbl);
}
你得到了 integer overflow。在大多数机器上,int
是 32 位宽(并且显然是有符号的)。这意味着它可以表示的最大数字是 2^31-1,即 2147483648。12!它的工作原理是 479001600(小于 2^31-1)但是 13!是 6227020800。所以 13!通常不能用 int
.
表示
您可以选择将 i
、user_input
和 tbl
设为更大的类型,例如 unsigned long long
或 uint64_t
(来自 #include <inttypes.h>
).但是这些类型也将具有最大可表示数。
如果您确实需要 C 中的任意精度,您可能需要考虑 GMP(GNU
多精度
算术库).
另请注意,签名类型的溢出在 C 语言中具有未定义的行为。
- 8bit unsigned char Max:0xFF-->255 ->2^8 - 1 (char)2^7 -1
- 16bit unsigned short Max:0xFFFF -->2^16 - 1(short)2^15 - 1
- 32 位无符号整数 Max:0xFFFFFFFF -->2^32 - 1(int)2^31 - 1
- 64 位无符号.....最大值:... --> 2^64 - 1(long long)2^63 - 1
- 都有Range.This不是纸上写的数
幸运的是,这个程序可以很好地找到 1 到 12 的阶乘,但是在 12 之后作为 13、14、20 ..... 输出出错,我也尝试找到 40 的阶乘,但输出为 0 . 找不到确切的问题...
#include <stdio.h>
int main() {
int user_input, tbl;
printf("Enter any number: \t");
scanf("%i", &user_input);
tbl = user_input;
for(int i=2; i < user_input; i++) {
tbl = tbl * i;
}
printf("Factorial of %i is %i", user_input, tbl);
}
你得到了 integer overflow。在大多数机器上,int
是 32 位宽(并且显然是有符号的)。这意味着它可以表示的最大数字是 2^31-1,即 2147483648。12!它的工作原理是 479001600(小于 2^31-1)但是 13!是 6227020800。所以 13!通常不能用 int
.
您可以选择将 i
、user_input
和 tbl
设为更大的类型,例如 unsigned long long
或 uint64_t
(来自 #include <inttypes.h>
).但是这些类型也将具有最大可表示数。
如果您确实需要 C 中的任意精度,您可能需要考虑 GMP(GNU 多精度 算术库).
另请注意,签名类型的溢出在 C 语言中具有未定义的行为。
- 8bit unsigned char Max:0xFF-->255 ->2^8 - 1 (char)2^7 -1
- 16bit unsigned short Max:0xFFFF -->2^16 - 1(short)2^15 - 1
- 32 位无符号整数 Max:0xFFFFFFFF -->2^32 - 1(int)2^31 - 1
- 64 位无符号.....最大值:... --> 2^64 - 1(long long)2^63 - 1
- 都有Range.This不是纸上写的数