Кастинг между подписанным и неподписанным - PullRequest
1 голос
/ 22 ноября 2010

Безопасно ли это:

int main()
{
    boost::int16_t t1 = 50000; // overflow here.
    boost::uint16_t t2 = (boost::uint16_t)t1;
    std::cout << t1 << " "  << t2 <<  std::endl;
}

Чтобы быть еще более конкретным: я храню эти данные в таблице, которая использует подписанные типы в своей схеме, безопасно ли хранить и получать эти данныетаким образом?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 22 ноября 2010

Нет, я считаю, что это определено реализацией. Из проекта стандарта C ++, §4.7 / 3

Если тип назначения подписан, значение не изменяется, если оно может быть представлены в типе назначения (и ширина поля битов); в противном случае значение определяется реализацией.

Это относится к первому утверждению. int16_t подписано и не может представлять 50000. Таким образом, значение t1 зависит от реализации.

Как только вы знаете, t1, § 1012 * гарантируется согласно § 4.7 / 2 как самый низкий uint16_t конгруэнтный модуль от 2 ^ 16 до t1 В основном, t1 мод 2 ^ 16.

1 голос
/ 22 ноября 2010

Я бы сказал, что это безопасно, но почему бы не использовать uint16_t без прохождения этого вводящего в заблуждение броска?

Типы существуют и для связи, не только для процесса компиляции.

0 голосов
/ 22 ноября 2010

Назначение числа, которое не может быть представлено в типе со знаком, определяется реализацией.Следующее преобразование, однако, имеет стандартное определенное поведение.Таким образом, результат функции определяется реализацией, если это безопасно или нет, это субъективный вопрос.Но переносимых между платформами или компиляторами это не так.

...