Я хотел бы знать правила, указанные стандартом языка C++ для ситуаций как:
long x = 200;
short y = static_cast<short>(x);
y
гарантируемый быть 200, или стандарт оставляет это до реализации для решения? Как хорошо различные компиляторы придерживаются стандарта?
В этом случае static_cast <>
является явным преобразованием типа. в стандарте говорится об интегральных преобразованиях в 4.7 / 3 «Интегральные преобразования»:
Если тип назначения подписан, значение не изменяется, если оно может быть представлено в типе назначения (и ширине битового поля); в противном случае значение определяется реализацией.
Поскольку short
гарантированно может содержать значение 200
( short
должно быть не менее 16 бит), то для вашего конкретного примера ответ Да.
Различные компиляторы достаточно хорошо придерживаются этого поведения - так было со времен C до появления ANSI, и так много кода зависит от поведения, что поставщики компиляторов, похоже, не хотят даже выдавать предупреждения о возможности усечения.
Если значение попадает в диапазон короткого значения
], тогда значение гарантированно будет правильным, что в вашем случае верно, поэтому y == 200
.
Если он выходит за пределы (например, static_cast
), то поведение не определено.Большинство компиляторов просто укорачивают двоичные цифры до нужного размера.