我编写的程序采用两个数字进行除法和模运算。
代码是
#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可以采用的最大值)。
答案 0 :(得分:2)
由于atoi
从ASCII转换为ints
而不转换为long ints
,因此9999999999999999999999999999999999999999999999
转换为int
远远不够。
尝试使用sscanf进行字符串转换,并尝试更合理的数字。
答案 1 :(得分:1)
atoi
会返回INT_MAX
。将32位int
与4294967295
进行比较始终为false,因为INT_MAX
大约小两倍。如果您使用strtoll
代替atoi
,则您的解决方案将有效,因为结果将在long long
范围内。或者,您可以使用INT_MAX
代替ADDRESS_SPACE
。
答案 2 :(得分:1)
18446744073709551615
是-1的无符号版本。 virtaddr
已签名,但您将其显示为未签名;当然-1将小于任何有效的正数。