Когда narrowing conversion Не является implementation defined?
Всем привет
Правильно ли я понимаю правила narrowing conversion:
1. Wide type -> Narrow type. Итоговый тип умещает результирующее значение. Например, int32_t = uint64_t, значение справа <= maxValue значения слева. ОК
2. Wide type -> Narrow type. Итоговый тип Не умещает результирующее значение. Например, int32_t = uint64_t, значение справа > maxValue значения слева. Implementation defined
По моему, в приведенном примере это всегда зависит от реалиации, т.к. компилятор не генерирует проверяющий код.
В приведенном примере длины типов равны, занчит будет просто побитовое копирование. Если бы длины типов были разные, то wide type обрезался до длины narrow type и то же самое побитовое копирование.
Если включен высокий уровень предупреждений, то в этом месте компилятор ругнется.
В приведенном примере, если значение uint32 >= 0x80000000, то в результате в int32 будет отрицательное число.
res2001, поправил на uint64_t для большей общности
Если бы длины типов были разные, то wide type обрезался до длины narrow type и то же самое побитовое копирование.
Правильно ли я понял, что если значение wide type будет находиться в допустимом диапазоне для narrow type, то результат будет так сказать "полностью defined", как будто типы изначально были одинаковые ?