Что стандарт языка C++ говорит о как дескрипторы static_cast, уменьшающие размер целого числа?

Я хотел бы знать правила, указанные стандартом языка C++ для ситуаций как:

long x = 200;
short y = static_cast<short>(x);

y гарантируемый быть 200, или стандарт оставляет это до реализации для решения? Как хорошо различные компиляторы придерживаются стандарта?

6
задан ReWrite 11 February 2010 в 02:44
поделиться

2 ответа

В этом случае static_cast <> является явным преобразованием типа. в стандарте говорится об интегральных преобразованиях в 4.7 / 3 «Интегральные преобразования»:

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

Поскольку short гарантированно может содержать значение 200 ( short должно быть не менее 16 бит), то для вашего конкретного примера ответ Да.

Различные компиляторы достаточно хорошо придерживаются этого поведения - так было со времен C до появления ANSI, и так много кода зависит от поведения, что поставщики компиляторов, похоже, не хотят даже выдавать предупреждения о возможности усечения.

9
ответ дан 17 December 2019 в 00:09
поделиться

Если значение попадает в диапазон короткого значения ], тогда значение гарантированно будет правильным, что в вашем случае верно, поэтому y == 200 .

Если он выходит за пределы (например, static_cast (1000000000) ), то поведение не определено.Большинство компиляторов просто укорачивают двоичные цифры до нужного размера.

-2
ответ дан 17 December 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: