MATLAB® Coder™, Simulink® Coder и Embedded Coder® генерируют код С, который использует сдвиг языка C, оставленный <<и право сдвига>> операторы. Современные компиляторы C обеспечивают сопоставимое поведение для операторов сдвига. Однако некоторые поведения операторов сдвига не полностью заданы некоторыми стандартами C. Когда вы работаете с продуктами генерации кода MathWorks®, необходимо знать, как справиться с использованием сдвигов C.
Дополнение Туо является способом интерпретировать двоичное число. Большинство современных процессоров представляет целые числа с помощью дополнения two. Продукты генерации кода MathWorks® требуют, чтобы C и компиляторы C++ представляли целые числа со знаком с помощью дополнения two. Тулбоксы MathWorks и документация используют дополнительное представление two исключительно.
Главная разница между арифметическим сдвигом и логическим сдвигом полна решимости. Арифметические сдвиги имеют математическое значение. Намерение логических сдвигов состоит в том, чтобы переместить биты, делая их полезными только для беззнакового целого используемый в качестве наборов битовых флагов.
Язык C не различает арифметические и логические сдвиги и обеспечивает только один набор операторов сдвига. Когда сдвиги использования продуктов генерации кода MathWorks на целых числах со знаком в сгенерированном коде, намерение всегда является арифметическим сдвигом. Для беззнакового целого нет никакого обнаруживаемого различия в поведении между логическими и арифметическими сдвигами.
Арифметический сдвиг влево представляет умножение степенью 2.
a << b = a*2^b
Если значение, произведенное путем умножения 2^b, является слишком большим, то переполнение происходит. В случае переполнения идеальный ответ повторяется по модулю 2^n, чтобы поместиться в тип данных. Стандарт C90 задает поведение сдвига влево. На битном уровне b битов переключен от левого конца и отброшен. В правильном конце переключаются на нижний регистр биты b значения 0. Стандарт не задает различие между без знака и со знаком. И для дополнения без знака и для подписанного дополнения two, битное поведение уровня обеспечивает намеченное арифметическое поведение сдвига влево.
Стандарт C99 описывает арифметическую интерпретацию. Это также утверждает, что для типов со знаком, поведение не определено для любой отрицательной величины или для положительного значения, которое переполнилось бы. Поставщик компилятора может использовать стандартный неопределенный пункт поведения C99, чтобы оптимизировать код способом, который изменяет поведение, предназначенное кодером. Если ваш компилятор C99-совместим, но не C90-совместим, то выключите опцию умножение Замены степенями двойки с поразрядными сдвигами со знаком (Embedded Coder) (Embedded Coder). Более старые стандарты C++ следуют стандарту C90 относительно оставленного сдвига. Более новые стандарты C++ подобны стандарту C99.
Арифметический сдвиг вправо представляет деление степенью 2, где идеальное частное округляется на пол.
a >> b = a/2^b
Когда a является неотрицательным, стандарты C утверждают, что сдвиг вправо должен обеспечить это арифметическое поведение. Если a подписывается и отрицателен, то стандарт утверждает, что реализация задает поведение. Стандарт C требует, чтобы компиляторы зарегистрировали свое поведение реализации. Почти подписанное право сдвига реализации всех компиляторов как арифметический сдвиг, который округляется на пол. Это - самое простое и самое эффективное поведение для поставщика компилятора, чтобы обеспечить. Если у вас есть компилятор, который не обеспечивает арифметический сдвиг вправо, или ваши стандарты кодирования не позволяют вам использовать подписанный сдвиг вправо, то можно выбрать опции, которые избегают права сдвига со знаком. Например, Позвольте сдвиги вправо на целых числах со знаком (Embedded Coder) (Embedded Coder) замены подписанные сдвиги вправо с вызовом функции.
В C, при сдвиге целого числа размера слова n, используют сумму сдвига между 0 и n – 1, включительно. Стандарт C не задает перемену другими суммами, такими как:
Сдвиг отрицательной константой.
Сдвиг суммой, больше, чем размер слова.
Когда сумма сдвига является постоянной, продукты не генерируют сдвиги из области значений. Риск сдвигов из области значений прибывает из явным образом смоделированных сдвигов, где сумма сдвига является не постоянной переменной. При моделировании сдвигов с переменными суммами сдвига убедитесь, что сумма сдвига всегда находится в области значений.
Существуют явные и неявные источники, переключает на нижний регистр модели и алгоритмы.
Явный
Неявный
Операции фиксированной точки, которые включают масштабирующееся изменение
При преобразовании масштабирования фиксированной точки, если сетевое наклонное изменение не является точной степенью двойки, то умножение, сопровождаемое сдвигом, аппроксимирует идеальный сетевой наклон. Для получения дополнительной информации о сетевом наклонном вычислении смотрите Указатель Сетевое Наклонное Вычисление (Fixed-Point Designer).
Лежа в основе высокоуровневых алгоритмов (например, Алгоритмы бпф)
Несколько параметров конфигурации имеют эффект на номер и стиль сдвигов, которые появляются в сгенерированном коде.
Деление целого числа со знаком округляется к (Simulink)
Установите этот параметр на Floor
или Zero
, чтобы избежать дополнительного сгенерированного кода.
Используйте деление для фиксированной точки сетевое наклонное вычисление (Simulink)
Когда включено, этот параметр использует деление вместо умножения, сопровождаемого сдвигами, чтобы выполнить фиксированную точку сетевое наклонное вычисление.
Замените умножение степенями двойки с поразрядными сдвигами со знаком (Embedded Coder)
Когда этот параметр включен, умножение степенями двойки заменяется поразрядными сдвигами со знаком. Очистка этой опции поддерживает соответствие MISRA C®.
Позвольте сдвиги вправо на целых числах со знаком (Embedded Coder)
Когда этот параметр включен, сгенерированный код может содержать право, поразрядно переключает на целых числах со знаком. Предотвратить право поразрядно переключает на целых числах со знаком, очистите эту опцию.
Сдвиг прямо на целом числе со знаком как арифметический сдвиг (Simulink)
Выберите этот параметр, если компилятор C реализует сдвиг вправо целого числа со знаком как арифметический сдвиг вправо.