rlimit64 целочисленное переполнение

В настоящее время я пытаюсь ограничить ресурсы памяти процесса. Прежде чем сделать это, я подготавливаю структуру 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. Hovever, в качестве вывода я получаю:

    18446744073709551615
    18446744073709551615
    0
    18446744073709551615 

Как это возможно?


person nil    schedule 12.06.2012    source источник


Ответы (1)


Шестнадцатеричный литерал интерпретируется как int.

Попробуйте использовать:

0x040000000LL * 16;

Так что компилятор обрабатывает литерал как длинный длинный.

Поскольку длинный длинный литерал (суффикс LL) - это C99, вам, вероятно, лучше приводить к любому типу члена структуры (хотя я полагаю, что любой последний компилятор будет поддерживать LL - gcc определенно поддерживает). Например, вы можете использовать long long.

person Corbin    schedule 12.06.2012