Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_s.doc
Скачиваний:
44
Добавлен:
24.02.2016
Размер:
665.09 Кб
Скачать
      1. Мультипликативные операции

Мультипликативные операции выполняют операции умножения "*", деления "/" и получения остатка от деления "%". Операндами операции % должны быть целые числа. Операции умножения "*" и деления "/" выполняются над целыми и плавающими операндами. Типы первого и второго операндов могут отличаться. Мультипликативные операции выполняют обычные арифметические преобразования операндов. Типом результата является тип операндов после преобразования.

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

Умножение "*"

Операция умножения указывает на то, что ее оба операнда должны быть умножены.

Деление "/"

Операция деления указывает на то, что ее первый операнд делится на второй. Если две целые величины не делятся нацело, то результат усекается. Деление на 0 дает непредсказуемые результаты.

Остаток от деления "%"

Результатом операции является остаток от деления первого операнда на второй.

Примеры

int i = 10, j = 3, n;

double x = 2.0, y;

y = x * i; /* example 1 */

n = i/j /* example 2 */

n = i % j /* example 3 */

В первом примере x умножается на i, в результате получается 20.0. Результат имеет тип double.

Во втором примере 10 делится на 3. Результат усекается до 3. и имеет тип int.

В третьем примере n присваивается остаток от деления 10 на 3, т.е. 1.

      1. Аддитивные операции

Аддитивные операции выполняют сложение "+" и вычитание "-". Операндами могут быть целые и плавающие величины. В некоторых случаях аддитивные операции могут также выполняться на адресных величинах. На целых и плавающих операндах выполняются обычные арифметические преобразования. Типом результата является тип операндов после преобразования. Преобразования, выполняемые аддитивными операциями, не подерживают левого и правого переполнения. Информация теряется, если результат аддитивной операции не может быть представлен типом операндов после преобразования.

Сложение "+"

Операция сложения специфицирует сложение двух операндов. Операнды могут быть целого или плавающего типов. Типы первого и второго операндов могут отличаться. Один операнд может быть указателем, а другой целой величиной. Когда целая величина складывается с указателем, то целая величина (i) преобразуется путем умножения ее на размер памяти, занимаемый величиной, адресуемой указателем. После преобразования целая величина представляет i позиций памяти, где каждая позиция имеет длину, специфицированную адресным типом. Когда преобразованная целая величина складывается с величиной указателя, то результатом является указатель, адресующий память, расположенную на i позиций дальше от исходного адреса. Новый указатель адресует тот же самый тип данных, что и исходный указатель.

Вычитание "-"

Операция вычитает второй операнд из первого. Операнды могут быть целого или плавающего типов. Типы первого и второго операндов могут отличаться. Допускается вычитание целого из указателя и вычитание двух указателей.

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

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

Адресная арифметика

Аддитивные операции, применяемые к указателю и целому, имеют осмысленный результат, когда указатель адресует массив памяти, а целая величина представляет смещение адреса в пределах этого массива. Преобразование целой величины к адресному смещению предполагает, что в пределах смещения плотно расположены элементы одинакового размера. Это предположение справедливо для элементов массива. Масив определяется как набор величин одного и того же типа; его элементы расположены в смежных ячейках памяти.

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

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

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

Аддитивные операции между адресной и целой величинами на машинах с сегментной архитектурой (такие как 8086/8088) может быть неправильной в некоторых случаях.

Примеры

int i = 4, j;

float x [ ];

float * px;

px = & x [4] + i; /* example 1 */

j = & x [i] - & x [i-2]; /* example 2 */

В первом примере целочисленный операнд i складывается с адресом пятого элемента х. Значения i умножается на длину типа float и складываются с & x [4]. Значение результирующего указателя представляет адрес x [8] элемента массива.

Во втором примере адрес третьего элемента x (задается как x [i-2]) вычитается из адреса пятого элемента x (эадается как x [i]). Полученная разность делится на длину типа float. В результате получается целая величина 2.