Можно ли перевести максимальное значение беззнакового целого числа в целое число и ожидать, что результат будет -1?

Я нашел код C++, в котором мы приводим беззнаковое целое число 32, инициализированное до его максимального значения, в подписанное целое число и ожидаем, что оно будет -1. Он хорошо работает на протестированном компиляторе, но действительно ли он переносим?

int GetBusinessDataID()
{
    u32_t id = ~0;

    // Some code that may return a valid ID.

    return id; // Here we expect to return -1.
}

person FloFu    schedule 07.01.2020    source источник
comment
Я думаю, что из С++ 20 это будет -1, поскольку целые числа со знаком будут дополнением 2, но на данный момент это не гарантируется стандартом.   -  person Gaurav Dhiman    schedule 07.01.2020


Ответы (1)


Это гарантируется для интегральных преобразований, начиная с C++20; до C++20 это определяется реализацией.

Если целевой тип знаковый, значение не изменяется, если исходное целое число может быть представлено в целевом типе. В противном случае результат

  • определяется реализацией (до C++20)

  • уникальное значение целевого типа, равное исходному значению по модулю 2n, где n — количество битов, используемых для представления целевого типа. (начиная с С++ 20).

person songyuanyao    schedule 07.01.2020
comment
если я хорошо понимаю, начиная с С++ 20: int value = 0xffffffff % 2^8, что 0xffffffff, что -1 для int - person FloFu; 07.01.2020
comment
@FloFu Я не могу понять, что ты имеешь в виду .. За 0xffffffff % 2^8 ты получишь 9. ПРЯМОЙ ЭФИР - person songyuanyao; 07.01.2020
comment
Я пытался понять, как работает преобразование. Я не понимаю, 'значение не изменяется, если исходное целое число может быть представлено в целевом типе'. Хотя значение 4294967295 не может быть представлено в int. Это шестнадцатеричное значение 0xffffffff can. Итак, здесь правило. Это правильно? - person FloFu; 07.01.2020
comment
@FloFu 0xffffffff тоже не может. Таким образом, учитывая int value = 0xffffffff;, value будет -1 (начиная с C++20). Кстати: 0xffffffff сам является литералом unsigned int. - person songyuanyao; 07.01.2020