从argv解析long long时出现意外的值

时间:2012-12-24 11:43:44

标签: c types

我是一名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的数字)和较小的数字也能正常工作。

我很困惑!

非常感谢!

2 个答案:

答案 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

最后,如果它按预期的那样工作,那么你的期望就会被打破,因为它不会给出正确的输出,因为数字在整个地方被截断。