ПрагмаСофтСтудия 2.1

Особенности операций

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

 

 

+ . Унарный плюс

Операция выполняется только с типами int, uint и float. Тип bool автоматически приводится к типу int. Операция всегда возвращает значение операнда и, по сути, не имеет практического применения.

 

! . Логическое отрицание

Операция работает с типом bool. Типы int, uint, float автоматически приводятся к нему. Операция возвращает true, если операнд имеет значение false, и наоборот.

 

~ . Поразрядное НЕ

Операция работает с типами int и uint. Типы bool и float автоматически приводятся к целому типу int. Для получения результата все биты значение операнда инвертируются. Если бит был равен 1, то он принимает значение 0, и наоборот.

 

% . Остаток от целочисленного деления

Операция работает со значениями целого типа int и uint. Тип string запрещён для использования. Типы bool и float автоматически приводятся к типу int.

Операция возвращает остаток от деления одного целого значения на другое.

5 % 2 = 1

Знак результата операции % может быть разным. При отработке проекта в САПР, знак результата принимается равным знаку левого операнда. Если вы используете функцию генерации программного кода, то работа операции % в этом случае зависит от того, какой стандарт языка C поддерживается вашим компилятором. Стандарт ISO 1999 также обязывает использовать знак левого операнда, и программный код будет работать в точности, как это происходит в программе. Но в стандарте ISO 1990 это не оговорено, и результат может быть любым. Если это ваш случай, заключайте операцию во встроенную функцию abs. Знак результата в этом случае будет всегда положительным.

 

<< . Линейный битовый арифметический сдвиг влево

Операция работает со значениями целого типа int и uint. Тип string запрещён для использования. Типы bool и float автоматически приводятся к типу int.

Операция выполняет сдвиг, при котором уходящий бит исчезает, не влияя на оставшиеся биты, а на месте появившегося бита записывается бит со значением 0.

Пример выше означает, что при сдвиге числа 00010111, записанного в двоичной системе счисления, на 1 бит влево, мы получим число 00101110.

Вы можете выполнять сдвиг на любое число разрядов. При сдвиге на значение разное или большее размерности левого операнда результат операции не определён и может быть любым. Для 32-битного операнда это значение равно 32 и более. Результат также не определён, если значение сдвигается на отрицательную величину.

0x00000ff0 << 0x8 = 0x000ff000

Сдвиг на 0 возвращает значение левого операнда.

 

>> . Линейный битовый арифметический сдвиг вправо

Операция работает со значениями целого типа int и uint. Тип string запрещён для использования. Типы bool и float автоматически приводятся к типу int.

Результат операции зависит от типов обоих операндов.

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

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

Копирование знакового бита гарантируется только при отработке проекта в программе. Если вы используете функцию генерации программного кода, то работа операции >> в этом случае полностью зависит от её реализации в используемом вами компиляторе языка C. В большинстве случаев знаковый бит будет копироваться, но возможно также запись в старший бит значения 0.

Для гарантии результата приводите оба операнда к типу uint или после выполнения операции накладывайте маску, используя битовую операцию &.

Аналогично сдвигу влево сдвиг вправо можно выполнять на любое число разрядов. При сдвиге на значение разное или большее размерности левого операнда результат операции не определён и может быть любым. Для 32-битного операнда это значение равно 32 и более. Результат также не определён, если операнд сдвигается на отрицательную величину.

0x000ff000 >> 0x8 = 0x00000ff0

Сдвиг на 0 возвращает значение левого операнда.

 

<   <=   >   >=   ==   != . Операции сравнения

Операции выполняются только с операндами типа bool. Тип string запрещено использовать, остальные типы приводятся к типу bool. Результатом операции также является тип bool, т.е. константа true или false.

Для сравнения строк используйте встроенную функцию strcmp.

 

& . Поразрядное И

Операция работает со значениями целого типа int и uint. Тип string запрещён для использования. Типы bool и float автоматически приводятся к типу int.

Действие операции эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. Иначе говоря, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1. Если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0. Таблица истинности операции приведена ниже.

 

^ . Поразрядное исключающее ИЛИ

Операция работает со значениями целого типа int и uint. Тип string запрещён для использования. Типы bool и float автоматически приводятся к типу int.

Операция сравнивает соответствующие биты двух операндов. Если они равны, то результирующий разряд равен 0, и получит значение 1 в обратном случае. Ниже приведена таблица истинности операции.

 

| . Поразрядное ИЛИ

Операция работает со значениями целого типа int и uint. Тип string запрещён для использования. Типы bool и float автоматически приводятся к типу int.

Действие операции эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. Другими словами, если оба соответствующих бита операндов равны 0, результирующий двоичный разряд равен 0. Если же хотя бы один бит из пары равен 1, то двоичный разряд результата равен 1. Таблица истинности операции приведена ниже.

 

&& . Логическое И

Операция работает со значениями типа bool. Типы int, uint и float автоматически приводятся к типу bool. Результат операции равен true только, если оба операнда равны true. Ниже приведена таблица истинности операции.

 

|| . Логическое ИЛИ

Операция работает со значениями типа bool. Типы int, uint и float автоматически приводятся к типу bool. Если хоть один из операндов равен true, то результат также равен true. Ниже приведена таблица истинности операции.

 

 

Авионика и Софт

forum.aviosoft.ru

 

сборка: 706