exponenta event banner

Создать код, содержащий правые сдвиги для подписанных целых чисел

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

Некоторые стандарты кодирования, такие как MISRA, не допускают правых сдвигов для подписанных целых чисел, поскольку различное оборудование может хранить отрицательные целые числа по-разному. Для отрицательных целых чисел можно получить различные ответы в зависимости от оборудования. Если вы хотите увеличить шансы на создание кода, совместимого с MISRA C, не допускайте правильных сдвигов для подписанных целых чисел.

Пример модели

Чтобы создать код со сдвигами вправо для целых чисел со знаком, создайте эту модель. Сигнал типа Data int16 подает в арифметический блок Shift. В диалоговом окне «Параметры арифметического блока сдвига» параметру «Биты для сдвига» > «Направление» присваивается значение Right. Параметр Bits to shift > Number имеет значение 3.

Создать код, содержащий правые сдвиги для подписанных целых чисел

  1. Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters) и перейдите на вкладку Стиль кода (Code Style). Параметр Разрешить правые сдвиги для подписанных целых чисел включен по умолчанию.

  2. Создайте код для модели.

В rightshift.c файл, rightshift_step функция содержит следующий код:

rightshift_Y.Out1 = (int16_T)(rightshift_U.In1 >> 3);

Целое число со знаком rightshift_U.In1 сдвинут на три бита вправо.

Создать код, который не допускает правых сдвигов для подписанных целых чисел

  1. Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters) и перейдите на вкладку Стиль кода (Code Style). Снимите флажок Разрешить правые сдвиги для подписанных целых чисел.

  2. Создайте код для модели.

В rightshift.c файл, rightshift_step функция содержит следующий код:

rightshift_Y.Out1 = (int16_T)asr_s32(rightshift_U.In1, 3U);

При сбросе параметра Разрешить правые сдвиги для целых чисел со знаком созданный код содержит вызов функции вместо правого сдвига для целого числа со знаком. Функция asr_s32 содержит следующий код:

int32_T asr_s32(int32_T u, uint32_T n)
{
  int32_T y;
  if (u >= 0) {
    y = (int32_T)((uint32_T)u >> n);
  } else {
    y = -(int32_T)((uint32_T)-(u + 1) >> n) - 1;
  }
 
  return y;
}

asr_s32 функция переводит целое число со знаком в целое число без знака, а затем смещает целое число без знака вправо.

Связанные темы