ПрагмаСофтСтудия 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. Ниже приведена таблица истинности операции.