3

現在、プロセスのメモリリソースを制限しようとしています。rlimit64その前に、を呼び出す構造体を準備しgetrlimit64ます。次のコードをコンパイルする場合

    rlimit64 as_limit;
    if (getrlimit64(RLIMIT_AS, &as_limit) == 0)
    {
        std::cerr << as_limit.rlim_cur << std::endl;
        std::cerr << as_limit.rlim_max << std::endl;

        as_limit.rlim_cur = 0x040000000 * 16;

        std::cerr << as_limit.rlim_cur << std::endl;
        std::cerr << as_limit.rlim_max << std::endl;
    }

割り当てが。の行の整数オーバーフローに関する警告が表示されas_limit.rlim_curます。しかし、私が得る出力として:

    18446744073709551615
    18446744073709551615
    0
    18446744073709551615 

これはどのように可能ですか?

4

1 に答える 1

2

16進リテラルはintとして解釈されています。

使用してみてください:

0x040000000LL * 16;

そのため、コンパイラーはリテラルをlonglongとして扱います。

long longリテラル(LLサフィックス)はC99であるため、構造体メンバーのタイプに関係なくキャストする方がよいでしょう(ただし、最近のコンパイラーはLLをサポートしていると思いますが、gccは間違いなくサポートしています)。たとえば、longlongにキャストできます。

于 2012-06-12T23:45:41.693 に答える