exponenta event banner

Объекты Fi и целочисленные типы данных C

Примечание

Разделы в этом разделе сравнивают fi объект с фиксированными типами данных и операциями в C. В этих разделах информация по ANSI ® C адаптирована от Сэмюэла П. Харбисона и Гая Л. Стила-младшего, C: Справочное руководство, 3-е изд., Прентис Холл, 1991.

Целочисленные типы данных

В этом разделе сравнивается численный диапазон fi целочисленные типы данных до минимального числового диапазона C целочисленных типов данных, предполагая представление комплемента типа Two.

C Целочисленные типы данных

Многие компиляторы C поддерживают двухмерное представление типа данных со знаком целого числа. В следующей таблице показаны минимальные диапазоны целочисленных типов данных C с использованием представления дополнения. Целочисленные диапазоны могут быть больше или равны показанным диапазонам, но не могут быть меньше. Диапазон long должно быть больше или равно диапазону int, который должен быть больше или равен диапазону short.

В представлении дополнения двух, целое число со знаком с n битами имеет диапазон от 2n − 1 до 2n − 1 − 1 включительно. Целое число без знака с n битами имеет диапазон от 0 до 2n − 1 включительно. Отрицательная сторона диапазона имеет на один больше значения, чем положительная сторона, и ноль представлен однозначно.

Целочисленный типМинимумМаксимум

signed char

–128

127

unsigned char

0

255

short int

–32,768

32,767

unsigned short

0

65,535

int

–32,768

32,767

unsigned int

0

65,535

long int

–2,147,483,648

2,147,483,647

unsigned long

0

4,294,967,295

Типы данных fi Integer

В следующей таблице перечислены числовые диапазоны целочисленных типов данных fi объект, в частности те, которые эквивалентны C-целочисленным типам данных. Диапазоны достаточно велики, чтобы разместить представление дополнения двух, которое является единственным способом двоичного кодирования со знаком, поддерживаемым программным обеспечением Fixed-Point Designer™.

КонструкторПодписанныйДлина словаДлина фракцииМинимумМаксимумБлижайший эквивалент ANSI C

fi(x,1,n,0)

Да

n
(от 2 до 65 535)

0

−2n−1

2n−1−1

Неприменимо

fi(x,0,n,0)

Нет

n
(от 2 до 65 535)

0

0

2n−1

Неприменимо

fi(x,1,8,0)

Да

8

0

–128

127

signed char

fi(x,0,8,0)

Нет

8

0

0

255

unsigned char

fi(x,1,16,0)

Да

16

0

–32,768

32,767

short int

fi(x,0,16,0)

Нет

16

0

0

65,535

unsigned short

fi(x,1,32,0)

Да

32

0

–2,147,483,648

2,147,483,647

long int

fi(x,0,32,0)

Нет

32

0

0

4,294,967,295

unsigned long

Унарные преобразования

Унарные преобразования определяют, преобразуется ли и каким образом один операнд перед выполнением операции. В этом разделе рассматриваются унарные преобразования в ANSI C и fi объекты.

Обычные унарные преобразования ANSI C

Унарные преобразования в ANSI C автоматически применяются к операндам унарных !, -, ~, и * операторов и двоичного << и >> операторов в соответствии со следующей таблицей:

Исходный тип операндаПреобразование ANSI C

char или short

int

unsigned char или unsigned short

int или unsigned int1

float

float

Массив T

Указатель на Т

Функция, возвращающая Т

Указатель на функцию, возвращающую Т

Тип 1If int не может представлять все значения исходного типа данных без переполнения, преобразованный тип unsigned int.

Обычные унарные преобразования Fi

В следующей таблице показаны fi унарные преобразования:

Оператор Cfi Эквивалентfi Преобразование

!x

~x = not(x)

Результат: logical.

~x

bitcmp(x)

Результат имеет тот же числовой тип, что и операнд.

*x

Нет эквивалента

Неприменимо

x<<n

bitshift(x,n)
положительный n

Результат имеет тот же числовой тип, что и операнд. Режим скругления всегда floor. Режим переполнения соблюдается. 0-значные биты сдвинуты справа.

x>>n

bitshift(x,-n)

Результат имеет тот же числовой тип, что и операнд. Режим скругления всегда floor. Режим переполнения соблюдается. 0-значные биты сдвигаются слева, если операнд не подписан или подписан и положителен. 1-значные биты сдвигаются слева, если операнд подписан и отрицателен.

+x

+x

Результат имеет тот же числовой тип, что и операнд.

-x

-x

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

Двоичные преобразования

В этом разделе описываются преобразования, которые происходят, когда операнды двоичного оператора имеют различные типы данных.

Обычные двоичные преобразования ANSI C

В ANSI C операнды двоичного оператора должны быть одного типа. Если они отличаются, один из них преобразуется в тип другого в соответствии с первым применимым преобразованием в следующей таблице:

Тип одного операндаТип другого операндаПреобразование ANSI C

long double

Любой

long double

double

Любой

double

float

Любой

float

unsigned long

Любой

unsigned long

long

unsigned

long или unsigned long1

long

int

long

unsigned

int или unsigned

unsigned

int

int

int

1Type long используется только в том случае, если он может представлять все значения типа unsigned.

Обычные двоичные преобразования Fi

Когда один из операндов бинарного оператора (+, –, *, .*) является fi объект, а другой является встроенным числовым типом MATLAB ®, то нет -fi операнд преобразуется в fi объект перед выполнением операции, согласно следующей таблице:

Тип одного операндаТип другого операндаСвойства другого операнда после преобразования в объект fi

fi

double or single

  • Signed = то же, что и оригинал fi операнд

  • WordLength = то же, что и оригинал fi операнд

  • FractionLength = установить наилучшую точность

fi

int8

  • Signed = 1

  • WordLength = 8

  • FractionLength = 0

fi

uint8

  • Signed = 0

  • WordLength = 8

  • FractionLength = 0

fi

int16

  • Signed = 1

  • WordLength = 16

  • FractionLength = 0

fi

uint16

  • Signed = 0

  • WordLength = 16

  • FractionLength = 0

fi

int32

  • Signed = 1

  • WordLength = 32

  • FractionLength = 0

fi

uint32

  • Signed = 0

  • WordLength = 32

  • FractionLength = 0

fi

int64

  • Signed = 1

  • WordLength = 64

  • FractionLength = 0

fi

uint64

  • Signed = 0

  • WordLength = 64

  • FractionLength = 0

Обработка переполнения

В следующих разделах сравнивается обработка переполнений ПО ANSI C и Fixed-Point Designer.

Обработка переполнения ANSI C

В ANSI C результатом операций со знаком целого числа является любое значение, полученное командой машины, используемой для реализации операции. Поэтому ANSI C не имеет правил для обработки переполнения целого числа со знаком.

Результаты переполнения целого числа без знака переносятся в ANSI C.

Обработка переполнения fi

Сложение и умножение с fi объекты дают результаты, которые могут быть точно представлены fi объект, длиной до 65 535 бит или доступная память на компьютере. Однако это не относится к делению, поскольку многие отношения приводят к бесконечным двоичным выражениям. Можно выполнить разделение с помощью fi с использованием divide , которая требует явного указания числового типа результата.

Условия, при которых fi переполнение объекта и полученные результаты определяются соответствующим fimath объект. Определенные признаки переполнения можно указать отдельно для сумм (включая разницы) и продуктов. См. следующую таблицу:

Свойства объекта fimath, связанные с обработкой переполненияЗначение свойстваОписание

OverflowAction

'saturate'

Переполнения насыщаются до максимального или минимального значения в диапазоне.

'wrap'

Переполнение обтекания с использованием арифметики по модулю, если оно не подписано, и два дополнения, если оно подписано.

ProductMode

'FullPrecision'

Результаты с полной точностью сохраняются. Переполнение не происходит. Если результирующая длина слова больше, чем MaxProductWordLength.

Правила вычисления результирующих длин слов и дробей изделия приведены в свойствах объекта fimath в ссылке на свойство.

 

'KeepLSB'

Сохраняются младшие биты продукта. Сохраняется полная точность, но возможно переполнение. Это поведение моделирует целочисленные операции языка C.

ProductWordLength свойство определяет результирующую длину слова. Если ProductWordLength больше, чем необходимо для произведения полной точности, то результат сохраняется в младших разрядах. Если ProductWordLength меньше, чем необходимо для изделия полной точности, затем происходит переполнение.

Правило для вычисления результирующей длины доли продукта задается в свойствах объекта fimath в ссылке на свойство.

 

'KeepMSB'

Сохраняются наиболее значительные биты продукта. Переполнение предотвращено, но точность может быть потеряна.

ProductWordLength свойство определяет результирующую длину слова. Если ProductWordLength больше, чем необходимо для произведения полной точности, то результат сохраняется в наиболее значащих битах. Если ProductWordLength меньше, чем необходимо для изделия полной точности, затем происходит округление.

Правило для вычисления результирующей длины доли продукта задается в свойствах объекта fimath в ссылке на свойство.

 

'SpecifyPrecision'

Можно указать как длину слова, так и длину дроби результирующего изделия.

ProductWordLength

Положительное целое число

Длина слова результата продукта при ProductMode является 'KeepLSB', 'KeepMSB', или 'SpecifyPrecision'.

MaxProductWordLength

Положительное целое число

Максимальная длина слова продукта, допустимая при ProductMode является 'FullPrecision'. Значение по умолчанию - 65 535 бит. Это свойство помогает гарантировать, что моделирование не превысит требования к оборудованию.

ProductFractionLength

Целое число

Длина фракции продукта, если ProductMode является 'Specify Precision'.

SumMode

'FullPrecision'

Результаты с полной точностью сохраняются. Переполнение не происходит. Если результирующая длина слова больше, чем MaxSumWordLength.

Правила вычисления суммарных длин слов и дробей приведены в свойствах объекта fimath в ссылке на свойство.

 

'KeepLSB'

Сохраняются наименьшие значащие биты суммы. Сохраняется полная точность, но возможно переполнение. Это поведение моделирует целочисленные операции языка C.

SumWordLength свойство определяет результирующую длину слова. Если SumWordLength больше, чем необходимо для суммы полной точности, то результат сохраняется в младших разрядах. Если SumWordLength меньше, чем необходимо для суммы полной точности, то происходит переполнение.

Правило вычисления результирующей длины суммарной дроби задается в свойствах объекта fimath в ссылке на свойство.

 

'KeepMSB'

Сохраняются наиболее значимые биты суммы. Переполнение предотвращено, но точность может быть потеряна.

SumWordLength свойство определяет результирующую длину слова. Если SumWordLength больше, чем необходимо для суммы полной точности, то результат сохраняется в наиболее значащих битах. Если SumWordLength меньше, чем необходимо для суммы полной точности, затем происходит округление.

Правило вычисления результирующей длины суммарной дроби задается в свойствах объекта fimath в ссылке на свойство.

 

'SpecifyPrecision'

Можно указать длину слова и длину дроби результирующей суммы.

SumWordLength

Положительное целое число

Длина слова суммы получается, когда SumMode является 'KeepLSB', 'KeepMSB', или 'SpecifyPrecision'.

MaxSumWordLength

Положительное целое число

Максимальная длина слова sum, допустимая при SumMode является 'FullPrecision'. Значение по умолчанию - 65 535 бит. Это свойство помогает гарантировать, что моделирование не превысит требования к оборудованию.

SumFractionLength

Целое число

Длина дроби суммы получается, когда SumMode является 'SpecifyPrecision'.