-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 |