0

我编写的程序需要两个数字,然后进行除法和模运算。

代码是

#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 可以采用的最大值)。

4

3 回答 3

2

因为atoi从 ASCII 转换到ints和不转换到long ints9999999999999999999999999999999999999999999999转换成int.

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

于 2012-05-08T03:20:56.053 回答
1

atoiINT_MAX当数字超出范围时返回。将 32 位与 32 位int进行4294967295比较总是错误的,因为INT_MAX它大约小两倍。如果您使用strtoll代替atoi,您的解决方案将有效,因为结果将在long long. 或者,您可以使用INT_MAX而不是ADDRESS_SPACE.

于 2012-05-08T03:25:39.533 回答
1

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

于 2012-05-08T03:27:52.617 回答