- •Тема 1. 7
- •Тема 2. 22
- •Тема 3. 41
- •Тема 4. 83
- •Основные временные параметры микропроцессора кр580ик80а
- •Программное обеспечение микропроцессора
- •Команды перемещения данных
- •Представлением операнда
- •Команды переходов ( альтернативные команды )
- •Специальные команды
- •Кодирование программы
- •Архитектура последовательного интерфейса кр580ик51
- •Управления от мп
- •Архитектура программируемого таймера кр580ви53
- •И микропроцессором
- •Архитектура бис параллельного интерфейса кр580вв55
- •Сигналами ппи
- •Архитектура контроллера прямого доступа к памяти кр580вт57
- •Архитектура бис программируемого контроллера прерываний кр580вн59
- •Генератор тактовыхимпульсов кр580гф24
- •Системный контроллер и шинный формирователь кр580вк28
- •Буферные регистры кр580ир82 и кр580ир83
- •Шинные формирователи кр580ва86 и кр580ва87
- •Пример подключения микросхемы кр580ви53 к микропроцессорной системе через контроллер прерываний кр580вн59
- •Пример подключения аналого-цифрового преобразователя.
- •Пример совместного использования микросхем комплекта для управления технологическим процессом.
- •Декларирование объектов
- •Структура программы
- •Константы
- •Арифметические операции
- •Преобразование типов операндов арифметических операций
- •Побитовые логические операции, операции над битами
- •Функции вывода информации
- •Стандартные математические функции
- •Условные операторы
- •If (условие ) оператор1;
- •If (условие1) оператор1;
- •Пример использования оператора if
- •Циклические операторы while и do–while
- •Пример использования оператора for
- •Строки, как одномерные массивы символов
- •Указатели и операции над адресами
- •Операция sizeof
- •Указатели на указатели
- •Пример динамического размещения одномерного массива в с
Арифметические операции
Операции выражения
Операции
Выражения используются для вычисления значений (определенного типа) и состоят из операндов, операций и скобок. Каждый операнд может быть, в свою очередь, выражением. Знак операции – это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются.
Операции делятся на унарные, бинарные и тернарные - по количеству участвующих в них операндов; выполняются в соответствии с приоритетами - для изменения порядка выполнения операций используются круглые скобки. Большинство операций выполняется слева направо, например,
a+b+c → (a+b)+c.
Исключение: унарные операции, операции присваивания и тернарная условная операция (?:) - справа налево.
Полный список операций приводится в прил. 2.
Арифметические операции - бинарные, их обозначения:
+(сложение);
-(вычитание);
/(деление, для int операндов - с отбрасыванием остатка);
*(умножение);
%(остаток от деления целочисленных операндов со знаком первого операнда - деление «по модулю»).
Операндами традиционных арифметических операций (+ - * /) могут быть константы, переменные, функции, элементы массивов, указатели, любые арифметические выражения.
Порядок выполнения операций:
1) выражения в круглых скобках;
2) функции (стандартные математические, функции пользователя);
3) операции * / (выполняются слева направо);
4) операции - + (слева направо).
Унарные операции +,– (знак числа) обладают самым высоким приоритетом, определены только для целых и вещественных операндов, «+» носит только информационный характер, «–» меняет знак операнда на противоположный. Таким образом, т.к. операции *, /, % обладают высшим приоритетом над операциями +, -, при записи сложных выражений нужно использовать общепринятые математические правила:
x+yz -
↔ x+y*z - a /(b+с)
.
Преобразование типов операндов арифметических операций
Сокращенная запись операции присваивания
Операция присваивания
Формат операции присваивания:
идентификатор = <выражение>;
Присваивание значения в языке Cи в отличие от традиционной интерпретации рассматривается как выражение имеющее значение левого операнда после присваивания. Таким образом, присваивание может включать несколько операций присваивания, изменяя значения нескольких операндов, например:
int i, j, k;
float x, y, z;
...
i = j = k = 0; ↔ k = 0, j = k, i = j;
x = i+(y = 3) - (z = 0); ↔ z = 0, y = 3, x = i + y - z;
Левым операндом операции присваивания может быть только именованная либо косвенно адресуемая указателем переменная. Примеры недопустимых выражений:
а) присваивание константе: 2 = x+y;
б) присваивание функции: getch() = i;
в) присваивание результату операции: (i+1) = 2+y;
В языке Cи используются два вида сокращений записи операции присваивания:
a) вместо записи v = v # e;
где # - арифметическая операция (операция над битовым представлением операндов), рекомендуется использовать запись v #= e; например, i = i + 2; ↔ i += 2; (знаки операций без пробелов);
б) вместо записи x = x # 1;
где # - символы, обозначающие операцию инкремента (+), либо декремента (-), x - целочисленная переменная (переменная-указатель), рекомендуется использовать запись:
##x; - префиксную
или
x##; - постфиксную.
Если эти операции используются в чистом виде, то различий между постфиксной и префиксной формами нет. Если же они используются в выражении, то в префиксной форме (##x) сначала значение x изменится на 1, а затем будет использовано в выражении; в постфиксной форме (x##) сначала значение используется в выражении, а затем изменяется на 1. Операции над указателями рассмотрим позже.
Пример 1: Пример 2:
int i,j,k; Смысл записи int n,a,b,c,d; Значения
float x,y; n = 2; a = b = c = 0;
... a = ++n; n=3, a=3
x* = y; x = x*y; a+ = 2; a=5
i+ = 2; i = i+2; b = n++; b=3, n=4
x/ = y+15; x = x/(y+15); b- = 2; b=1
--k k = k-1; c = --n; n=3, c=3
--k k = k-1; c* = 2; c=6
j = i++; j = i; i = i+1; d = n--; d=3, n=2
j = ++i; i = i+1; j = i; d% = 2; d=1
В операциях могут участвовать операнды различных типов, в этом случае они преобразуются к общему типу в порядке увеличения их "размера памяти", т.е. объема памяти, необходимого для хранения их значений. Поэтому неявные преобразования всегда идут от "меньших" объектов к "большим". Схема выполнения преобразований операндов арифметических операций:
short, char → int → unsigned → long → double
float → double
Стрелки отмечают преобразования даже однотипных операндов перед выполнением операции, т.е. действуют следующие правила:
- значения типов char и short всегда преобразуются в int;
- если любой из операндов (a или b) имеет тип double, то второй преобразуется в double;
- если один из операндов long, то другой преобразуется в long.
Результатом 1/3 будет «0», чтобы избежать такого рода ошибок необходимо явно изменять тип хотя бы одного операнда, т.е. записывать, например: 1. / 3.
Типы char и int могут свободно смешиваться в арифметических выражениях. Каждая переменная типа charавтоматически преобразуется в int, что обеспечивает значительную гибкость при проведении определенных преобразований символов.
При присваивании значение правой части преобразуется к типу левой, который и является типом результата. И здесь необходимо быть внимательным, т.к. при некорректном использовании операций присваивания могут возникнуть неконтролируемые ошибки. Так, при преобразовании int в char старший байт просто отбрасывается.
Пусть имеются значения:
float x; int i;
тогда
x=i; и i=x;
приводят к преобразованиям, причем float преобразуется в int сотбрасыванием дробной части. Тип double преобразуется во float округлением. Длинное целое преобразуется в более короткое целое и char посредством отбрасывания лишних бит более высокого порядка.
При передаче данных функциям также происходит преобразование типов: в частности, char становится int, а float -double.
