Можно ли переносить максимальное значение беззнакового int в int и ожидать, что результат будет -1? - PullRequest
2 голосов
/ 07 января 2020

Я нашел код 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.
}

1 Ответ

5 голосов
/ 07 января 2020

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

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

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

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

...