Использование сдвигов продуктами генерации кода C

Введение в сдвиги продуктами генерации кода

MATLAB® Coder™, Simulink® Кодер и 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). Более старые стандарты C++ следуют стандарту C90 относительно оставленного сдвига. Более новые стандарты C++ похожи на стандарт C99.

Арифметические сдвиги вправо

Арифметический сдвиг вправо представляет деление степенью 2, где идеальное частное округляется на пол.

a >> b = a/2^b

Когда a является неотрицательным, стандарты C утверждают, что сдвиг вправо должен обеспечить это арифметическое поведение. Если a подписывается и отрицателен, то стандарт утверждает, что реализация задает поведение. Стандарт C требует, чтобы компиляторы зарегистрировали свое поведение реализации. Почти подписанное право сдвига реализации всех компиляторов как арифметический сдвиг, который округляется на пол. Это - самое простое и самое эффективное поведение для поставщика компилятора, чтобы обеспечить. Если у вас есть компилятор, который не обеспечивает арифметический сдвиг вправо, или ваши стандарты кодирования не позволяют вам использовать подписанный сдвиг вправо, то можно выбрать опции, которые избегают права сдвига со знаком. Например, Позвольте сдвиги вправо на целых числах со знаком (Embedded Coder) замены подписанные сдвиги вправо с вызовом функции.

Сдвиги из области значений

В C, при сдвиге целого числа размера слова n, используют сумму сдвига между 0 и n – 1, включительно. Стандарт C не задает перемену другими суммами, такими как:

  • Сдвиг отрицательной константой.

  • Сдвиг суммой, больше, чем размер слова.

Когда сумма сдвига является постоянной, продукты не генерируют сдвиги из области значений. Риск сдвигов из области значений прибывает из явным образом смоделированных сдвигов, где сумма сдвига является не постоянной переменной. При моделировании сдвигов с переменными суммами сдвига убедитесь, что сумма сдвига всегда находится в области значений.

Моделирование источников сдвигов

Существуют явные и неявные источники, переключает на нижний регистр модели и алгоритмы.

Явный

Неявный

  • Операции фиксированной точки, которые включают масштабирующееся изменение

    При преобразовании масштабирования фиксированной точки, если сетевое наклонное изменение не является точной степенью двойки, то умножение, сопровождаемое сдвигом, аппроксимирует идеальный сетевой наклон. Для получения дополнительной информации о сетевом наклонном расчете смотрите Указатель Сетевой Наклонный Расчет.

  • Лежа в основе высокоуровневых алгоритмов (например, Алгоритмы бпф)

Управление переключает сгенерированный код на нижний регистр

Несколько параметров конфигурации оказывают влияние на номер и стиль сдвигов, которые появляются в сгенерированном коде.