exponenta event banner

Побитовая и арифметическая операция с одними и теми же данными

Оператор со смешанными побитовыми и арифметическими операциями

Описание

Этот дефект возникает, когда побитовые и арифметические операции выполняются в одном выражении.

Риск

Смешанные побитовые и арифметические операции компилируются. Однако размер целочисленных типов влияет на результат этих смешанных операций. Например, арифметический эквивалент сдвига влево (<<) на определенное количество битов зависит от количества битов в сдвигаемой переменной и, следовательно, от внутреннего представления ее типа данных. При смешении побитовых и арифметических операций одно и то же выражение может давать разные результаты для разных целей.

Смешанные операции также снижают читаемость и ремонтопригодность.

Зафиксировать

Разделяйте побитовые и арифметические операции или используйте только один тип операции на инструкцию.

Примеры

развернуть все

unsigned int bitwisearithmix()
{
    unsigned int var = 50;
    var += (var << 2) + 1;
    return var;
}

В этом примере показаны побитовые и арифметические операции с переменной var. var сдвигается на два (побитовое), затем увеличивается на 1 и добавляется в себя (арифметика).

Коррекция - только арифметические операции

Это выражение можно сократить до операций только с арифметикой: var + (var << 2) эквивалентно var * 5.

unsigned int bitwisearithmix()
{
    unsigned int var = 50;
    var = var * 5 +1;
    return var;
}

Информация о результатах

Группа «Надлежащая практика»
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: BITWISE_ARITH_MIX
Воздействие: Низкий
ИДЕНТИФИКАТОР CWE: 710
Представлен в R2016b