Вопрос

Это безопасно:

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

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

Спасибо!

Это было полезно?

Решение

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

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

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

Как только вы знаете t1, t2 гарантируется §4.7 / 2, чтобы быть самым низким uint16_t Конгреант модуль 2 ^ 16 до t1. Отказ В принципе, t1 мод 2 ^ 16.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top