Предупреждение Lint: #647: подозрительное усечение
Я прочитал соответствующие вопросы к этому предупреждению Lint о подозрительном усечении, но здесь это чисто случай C.
Следующая строка где Warning #647
всплывает:
pCont->sig -= (signed int64_t)((sub2 << 8)/pCont->freq + 1);
где pCont->sig
также 64-битная подпись (тип signed int64_t
) и то и другое sub2
а также freq
32-битные без знака. Все это скомпилировано с armcc.
Уже безуспешно пытался разыграть 1
32-разрядному без знака, но проблема сохраняется.
Любая идея о том, что я мог бы попробовать, или что здесь не так?
1 ответ
Из этой ссылки о предупреждении
Например:
(long) (n << 8)
может вызвать это сообщение, если n - беззнаковое целое, тогда как
(long) n << 8
не будет. В первом случае сдвиг выполняется с точностью int, и старшие 8 битов теряются, даже если происходит последующее преобразование в тип, который может содержать все биты. Во втором случае сдвинутые биты сохраняются.
Похоже, это точно подходит к вашему случаю и покажет вам, как это исправить.