exponenta event banner

Подписанная правая смена (-logical-signed-right-shift)

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

Описание

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

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

Задать опцию

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

файл командной строки и параметров: Использовать параметр -logical-signed-right-shift. См. раздел Сведения о командной строке.

Зачем использовать этот параметр

В стандарте C99 (sec 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
По умолчанию: арифметические сдвиги с подписью вправо
Пример (поиск ошибок): polyspace-bug-finder -logical-signed-right-shift
Пример (проверка кода): polyspace-code-prover -logical-signed-right-shift
Пример (сервер поиска ошибок): polyspace-bug-finder-server -logical-signed-right-shift
Пример (сервер проверки кода): polyspace-code-prover-server -logical-signed-right-shift