Я не знаю, какой у вас тип i16
, потому что он не соответствует стандарту C ++ 11.Я предполагаю, что вы имеете в виду тип ìnt16_t
от <cstdint>
, так что 16-разрядное целое число со знаком и что ваши sizex
и sizey
имеют тип int16_t
.
Ваш c_scale
это какой-то double
.Так что, вероятно, IEEE754 64 бит с плавающей точкой двойной точности.См. http://floating -point-gui.de / для получения дополнительной информации.Он имеет 53-битную мантиссу.
Как можно ожидать, что 53 бита уместятся без потерь (во всех случаях) в 16 бит?Принцип pigeonhole применяется и сразу же сообщает вам, что, поскольку 2 53 больше 2 16 , это не так.
Компилятор прав, чтобы предупредить вас.В самом деле, вы можете явный какой-то актерский состав, чтобы избежать этого предупреждения
И, эксплицирующий актерский состав, вы просто скажете своему читателю, что вам это известно.Возможно, сгенерированный машинный код не изменится ни с приведением, ни с преобразованием.
Возможно, у вашего конкретного компилятора могут быть другие способы отключить это предупреждение (возможно, некоторые #pragma
)
Вы можете использовать более сложную технологию статического анализа (возможно, Frama-Clang ), чтобы провести более семантический анализ и доказать, что приведение не дает утечки точности.Осторожно, такие инструменты могут быть сложными в освоении!
Кстати, стандарт C ++ мало говорит о предупреждениях в целом (они - вещь "качества реализации").Вы можете принять решение игнорировать их (но на практике вы не должны).