Во-первых, нет ничего изначально неправильного или небезопасного с кодом как есть. Преобразование по назначению является полностью законной частью языка C. Если это устаревший код, в котором вы не знаете , безопасно ли это делается или нет, вам нужно провести анализ, чтобы определить это.
Если вы обнаружите, что вам нужно поймать возможные значения за пределами допустимых значений (которые приводят к неопределенному поведению (!!) при преобразовании в int
), ваш код неверен и равен agile. Сравнения, такие как:
double x;
...
if (x < INT_MAX) ...
принудительно INT_MAX
для типа double
для сравнения. На практике в мире, где double
- это двойной IEEE, а int
- 32-разрядный, это оказывается безопасным, но это будет небезопасно, например, если вы изменили double
на float
, так как 32-разрядный INT_MAX
не может быть представлен с одинарной точностью float
. Значение будет округлено, а затем будет выполнено сравнение после округления.
Теперь, оказывается, у вас также есть ошибка "по одному" (<= INT_MAX
, а не < INT_MAX
, это то, что в -bounds), а также неверные логики c (||
вместо &&
), поэтому округление фактически исправит часть этого. Но не стоит зависеть от этого. Вместо этого вам нужно произвести степень двойки, с которой вы можете сравнивать, так что конвертировать в плавающую точку можно безопасно. Например:
if (x < 2.0*(INT_MAX/2+1) && x >= INT_MIN)
if (-x > (-INT_MAX-1) && x >= INT_MIN)
if (-x > INT_MIN && x >= INT_MIN)
Все они предполагают, что INT_MIN
на самом деле степень двойки (дополнение к полному диапазону), которая является разумным предположением реального мира и требуется C2x +. Если вы хотите больше общности, это больше работы.
Наконец, я сначала написал это как комментарий к вашему вопросу, но чем больше я думаю об этом, он действительно принадлежит к ответу: основываясь на том, что ваш C Кажется, что я умел бы очень осторожно делать какие-либо ненужные или "зачистки" изменения в этом коде. Вы, вероятно, сломаете намного больше, чем исправите. Вносите изменения только в том случае, если вы провели анализ, чтобы определить, есть ли активная ошибка, и не реорганизуйте вещи и не изменяйте типы для исправления. Вносите простые прямые исправления.