Signed right shift (-logical-signed-right-shift)

Задайте, как обработать бит знака для логических правых сдвигов на подписанных переменных

Описание

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

Эта опция не изменяет выражения во время компиляции. Для получения дополнительной информации см. «Ограничение».

Задать опцию

Пользовательский интерфейс (только для настольных продуктов): В строении проекта опция находится на узле Target & Compiler.

Командная строка и файл опций: Используйте опцию -logical-signed-right-shift. См. «Информация о командной строке».

Зачем использовать эту опцию

Стандарт C99 (сек. 6.5.7) утверждает, что для операции правой смены x1>>x2, если x1 подписан и имеет отрицательные значения, поведение определено реализацией. Различные компиляторы выбирают между арифметическим и логическим сдвигом. Используйте эту опцию, чтобы эмулировать компилятор.

Настройки

По умолчанию: Arithmetical

Arithmetical

Бит знака остается:

(-4) >> 1 = -2
(-7) >> 1 = -4
  7  >> 1 = 3
Logical

0 заменяет бит знака:

(-4) >> 1 = (-4U) >> 1 = 2147483646
(-7) >> 1 = (-7U) >> 1 = 2147483644
  7  >> 1 = 3

Ограничение

В выражениях во время компиляции это Polyspace® опция не изменяет стандартное поведение для правых сдвигов.

Для примера рассмотрим это правильное выражение сдвига:

int arr[ ((-4) >> 20) ];
Компилятор вычисляет размеры массивов, поэтому выражение (-4) >> 20 оценивается во время компиляции. Логически это выражение эквивалентно 4095. Однако арифметически результат -1. Этот оператор вызывает ошибку компиляции (массивы не могут иметь отрицательного размера), потому что стандартное поведение правого сдвига для подписанных целых чисел является арифметическим.

Информация о командной строке

При использовании командной строки арифметика является режимом расчетов по умолчанию. Когда эта опция установлена, выполняется логический расчет.

Параметр: -logical-signed-right-shift
По умолчанию: Арифметические подписанные правые сдвиги
Пример (Bug Finder): polyspace-bug-finder -logical-signed-right-shift
Пример (Code Prover): polyspace-code-prover -logical-signed-right-shift
Пример (Bug Finder Server): polyspace-bug-finder-server -logical-signed-right-shift
Пример (Code Prover Server): polyspace-code-prover-server -logical-signed-right-shift