Для некоторых арифметических операций процессору может потребоваться n-разрядное значение фиксированной точки и сохранить его в m биты, где m ≠ n. Если m < n, уменьшенный диапазон значения может вызвать переполнение для арифметической операции. Некоторые процессоры идентифицируют это переполнение как Inf или NaN. Другие процессоры, особенно цифровые сигнальные процессоры (DSP), обрабатывают переполнения путем насыщения или обтекания значения.
Дополнительные сведения о насыщении и обтекании для переполнения целых чисел см. в разделе Насыщение и обертывание (Fixed-Point Designer).
Для диаграмм Stateflow ® в моделях Simulink ® можно управлять тем, происходит ли насыщение при переполнении целых чисел. Для управления обработкой переполнения используйте свойство диаграммы Saturate on integer overflow.

| Флажок | Когда использовать этот параметр | Обработка переполнения | Пример результата |
|---|---|---|---|
| Отобранный | Переполнение возможно для данных на диаграмме, и требуется явная защита от насыщения в сгенерированном коде. | Переполнения насыщаются минимальным или максимальным значением, которое может представлять тип данных. | Переполнение, связанное со значащим 8-битовым целым числом, в сгенерированном коде достигает -128 или + 127. |
| Очищенный | Требуется оптимизировать эффективность созданного кода. | Обработка переполнений зависит от компилятора Си, который используется для создания кода. | Число 130 не помещается в знаковое 8-битовое целое число и переносится в -126 в сгенерированном коде. |
Арифметические операции, для которых можно включить защиту от насыщения:
Унарный минус: -a
Двоичные операции: a + b, a – b, a * b, a / b, a ^ b
Операции назначения: a += b, a –=b, a *= b, a /= b
В диаграммах C операции приращения и уменьшения: ++, --
При выборе параметра «Насыщение при переполнении целого числа» помните, что:
Насыщение относится ко всем промежуточным операциям, а не только к выходному или конечному результату.
Генератор кода может обнаружить некоторые случаи, когда переполнение невозможно. В этих случаях сгенерированный код не включает защиту от насыщения.
Чтобы определить, является ли снятие флажка Насыщение при переполнении целых чисел безопасным вариантом, выполните тщательный анализ логики, включая моделирование при необходимости. Если насыщение необходимо только в некоторых разделах логики, инкапсулируйте эту логику в атомарные подшаблоны или функции MATLAB и определите другой набор настроек насыщения для этих единиц.
В диаграммах используются правила ANSI ® C для целочисленного продвижения.
Все арифметические операции используют тип данных, который имеет ту же длину слова, что и целевой размер слова. Поэтому промежуточный тип данных в цепной арифметической операции может отличаться от типа данных операндов или конечного результата.
Для операндов с целочисленными типами, меньшими, чем целевой размер слова, происходит продвижение к большему типу с той же длиной слова, что и целевой размер. Это неявное приведение происходит до выполнения каких-либо арифметических операций.
Например, когда целевой размер слова составляет 32 бита, неявная приведение к int32 возникает для операндов с типом uint8, uint16, int8, или int16 перед выполнением каких-либо арифметических операций.
Предположим, что у вас есть следующее выражение, где y, u1, u2, и u3 являются uint8 тип:
y = (u1 + u2) - u3;
На основе правил целочисленного продвижения это выражение эквивалентно следующим операторам:
uint8_T u1, u2, u3, y; int32_T tmp, result; tmp = (int32_T) u1 + (int32_T) u2; result = tmp - (int32_T) u3; y = (uint8_T) result;
Для каждого расчета применяются следующие типы данных и пределы насыщения.
| Вычисление | Тип данных | Пределы насыщения |
|---|---|---|
tmp | int32 | (MIN_INT32, MAX_INT32) |
result | int32 | (MIN_INT32, MAX_INT32) |
y | uint8 | (MIN_UINT8, MAX_UINT8) |
Предположим, что u1, u2, и u3 равны 200. Поскольку пределы насыщения зависят от промежуточных типов данных, а не от типов операндов, будут получены следующие значения:
tmp составляет 400.
result составляет 200.
y составляет 200.
Предположим, что на панели Диагностика: валидность данных (Diagnostics: Data Validity) диалогового окна Параметры конфигурации модели (Model Configuration Parameters) задано значение Наложение при переполнении (Wrap on overflow). error или warning. При выборе опции Насыщить при целочисленном переполнении (Saturate on integer overflow) функция Stateflow не помечает случаи целочисленного переполнения во время моделирования. Однако Stateflow продолжает отмечать следующие ситуации:
Нарушения данных вне диапазона на основе проверок минимального и максимального диапазона
Операции с разделением на ноль