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

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

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

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

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

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

  1. Откройте диалоговое окно Model Параметры Конфигурации и выберите вкладку Code Style. Параметр Allow right shifts on signed integers включен по умолчанию.

  2. Сгенерируйте код для модели.

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

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

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

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

  1. Откройте диалоговое окно Model Параметры Конфигурации и выберите вкладку Code Style. Очистите параметр Allow right shifts on signed integers.

  2. Сгенерируйте код для модели.

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

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

Когда вы очищаете параметр Allow right shifts on signed integers, сгенерированный код содержит вызов функции вместо правого сдвига на целое число со знаком. Функция 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;
}

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

Похожие темы