0

私が書いたプログラムは2つの数値を取り、除算とモジュロ演算を行います。

コードは

#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_SPACEifステートメントが機能しないのはなぜですか?オーバーフローがあることは知っていますが、変数を出力してもエラーは表示されず、数値のままです(long intが取ることができる最大値)。

4

3 に答える 3

2

atoiASCII から への変換とへの変換でintsはなく、に変換するlong ints9999999999999999999999999999999999999999999999は大きすぎるためintです。

文字列変換にsscanfを使用してみてください。また、より適切な数値を試してください。

于 2012-05-08T03:20:56.053 に答える
1

atoiINT_MAX数値が範囲外の場合に戻ります。は約 2 倍小さいため、32 ビットintをと比較する4294967295と常に false になります。の代わりにINT_MAXを使用すると、結果が の範囲になるため、ソリューションが機能します。または、代わりに を使用することもできます。strtollatoilong longINT_MAXADDRESS_SPACE

于 2012-05-08T03:25:39.533 に答える
1

18446744073709551615-1 の無署名バージョンです。virtaddr署名されていますが、署名なしとして表示されました。もちろん、-1 は有効な正の数よりも小さくなります。

于 2012-05-08T03:27:52.617 に答える