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

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

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

Модель в качестве примера

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

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

  1. Откройте диалоговое окно Model Configuration Parameters и выберите вкладку 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 Configuration Parameters и выберите вкладку 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;
}

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

Похожие темы