Предупреждение 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 битов теряются, даже если происходит последующее преобразование в тип, который может содержать все биты. Во втором случае сдвинутые биты сохраняются.

Похоже, это точно подходит к вашему случаю и покажет вам, как это исправить.

Другие вопросы по тегам