我是一名Python程序员试图打破我的方式进入C.有没有人能帮助我理解这种意想不到的行为?
#include <stdio.h>
#include <stdlib.h>
int modulo(int a, int b) {
return a - b * (a / b);
}
int main(int argc, char **argv) {
printf("The largest possible LLu is %llu.\n", -1LLu);
unsigned long long x = atoi(argv[1]);
unsigned long long i;
printf("Finding the largest prime number less than %llu.\n", x);
for(i = 2; i < (x / 2) + 1; i ++) {
if(modulo(x, i) == 0) {
i = 2;
x--;
}
}
printf("Found %d.\n", (int)x);
return(0);
}
然后在终端上:
./ prog 111111111189
最大可能的LLu是18446744073709551615。
找到小于18446744073151513109的最大素数。
然而,该程序对于一些非常大的数字(小于最大LLu的数字)和较小的数字也能正常工作。
我很困惑!
非常感谢!
答案 0 :(得分:1)
atoi()
返回int
您在命令行输入的值会溢出int
使用atoll()
,甚至更好地使用strtoll()更灵活与atoi()
不同,它可以处理溢出:
atoll(argv[1]);
//or
strtoll(argv[1], NULL, 10);
答案 1 :(得分:0)
首先,C有一个内置的模运算符%
。没有理由自己制作。
其次,您的模数函数只需int
个值,atoi
会返回int
。因此,您的计划仅限于int
,而不是unsigned long long
。
最后,如果它按预期的那样工作,那么你的期望就会被打破,因为它不会给出正确的输出,因为数字在整个地方被截断。