大数字之间的比较似乎不起作用

时间:2012-05-08 03:13:37

标签: c if-statement

我编写的程序采用两个数字进行除法和模运算。

代码是

#define ADDRESS_SPACE 4294967295
int main (int argc, char *argv[]) {
    long int pagesize = atoi(argv[1]), virtaddr = atoi(argv[2]);

    if (virtaddr >= ADDRESS_SPACE) {puts("Address is too large"); return 1;}

    printf("%lu\n", virtaddr);
    printf("%lu\n", ADDRESS_SPACE);
    printf("Page = %lu\nOffset = %lu\n", virtaddr/pagesize, virtaddr%pagesize);
    return 0;
}

执行./page 1024 9999999999999999999999999999999999999999999999会得到以下输出

18446744073709551615
4294967295
Page = 0
Offset = 18446744073709551615

如果virtaddr大于ADDRESS_SPACE,为什么if语句不起作用?我知道有溢出,但打印变量不会显示任何错误,它们仍然是数字(long int可以采用的最大值)。

3 个答案:

答案 0 :(得分:2)

由于atoi从ASCII转换为ints而不转换为long ints,因此9999999999999999999999999999999999999999999999转换为int远远不够。

尝试使用sscanf进行字符串转换,并尝试更合理的数字。

答案 1 :(得分:1)

当数字超出范围时,

atoi会返回INT_MAX。将32位int4294967295进行比较始终为false,因为INT_MAX大约小两倍。如果您使用strtoll代替atoi,则您的解决方案将有效,因为结果将在long long范围内。或者,您可以使用INT_MAX代替ADDRESS_SPACE

答案 2 :(得分:1)

18446744073709551615是-1的无符号版本。 virtaddr已签名,但您将其显示为未签名;当然-1将小于任何有效的正数。