Хелпикс

Главная

Контакты

Случайная статья





2.4. Арифметические операции



Арифметические операции сложения, вычитания, умножения и деления основаны на общих правилах, применяемых в позиционных си­стемах счисления.

 

2.4.1. Арифметическое сложение

2.4.1.1. Арифметическое сложение двоичных чисел

 

Арифметическое сложение двоичных чисел выполняется по следующим правилам:

0 + 0 = 02; 0 + 1 = 12; 1 + 0 = 12; 1 + 1 = 102; 1 + 1 + 1 = 112.

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

 

Пример: Сложить два числа 2810 + 5810 в восьмиразрядной сетке. Порядок выполнения арифметического сложения двоичных чисел в восьмиразрядной сетке приведен в табл. 2.20.1.

 

Табл.2.20.1.                        Арифметическое сложение двух чисел 2810 + 5810

Система счисления  

Двоичное число

Десятичное число

Номер разряда С
Перенос  
1-е слагаемое  
2-е слагаемое  
Сумма  
                         

Примечание. С – это бит переноса из старшего седьмого разряда.

Ответ: 2810 + 5810 = 0001 11002 - 0011 10102 = 0101 01102 = 8610.

 

Пример: Сложить два числа 25510 + 110 в восьмиразрядной сетке. Порядок выполнения арифметического сложения двоичных чисел в восьмиразрядной сетке приведен в табл. 2.20.2.

 

Табл.2.20.2.                        Арифметическое сложение двух чисел 25510 + 110

Система счисления  

Двоичное число

Десятичное число

Номер разряда С
Перенос      
1-е слагаемое  
2-е слагаемое      
Сумма  
                           

Примечание. Значение бита переноса С в результате не учитывается.

 

Ответ: при сложении десятичных чисел 25510 + 110 получается 25610, которое не входит в диапазон восьмиразрядной сетки 0 … 25510. Поэтому результат в двоичной системе 000000002 получается неверный из-за переполнения восьмиразрядной сетки. Для получения правильного результата необходимы вычисления с двойной точностью, то есть в шестнадцатиразрядной сетке.

 

Пример: Сложить два числа 25510 + 110 в шестнадцатиразрядной сетке. Порядок выполнения арифметического сложения двоичных чисел в шестнадцатиразрядной сетке приведен в табл. 2.20.3.

 

Табл.2.20.3.                        Арифметическое сложение двух чисел 25510 + 110

Система счисления  

Двоичное число

Номер разряда С
Перенос
1-е слагаемое  
2-е слагаемое  
Сумма  

 

Ответ: при сложении десятичных чисел 25510 + 110 получается 25610, которое входит в диапазон шестнадцатиразрядной сетки 0 … 6553510. Поэтому результат в двоичной системе получается верный 0000 0001 0000 00002 = 25610.

 

Пример: Сложить два числа -110 + 110 в восьмиразрядной сетке. Порядок выполнения арифметического сложения двоичных чисел в восьмиразрядной сетке приведен в табл. 2.20.4.

 

Табл.2.20.4.                        Арифметическое сложение двух чисел -110 + 110

Система счисления

Двоичное число

Десятичное число
Номер разряда СF
Перенос  
1-е слагаемое   -1
2-е слагаемое   +1
Сумма  

Примечание. СF – разряд переноса (заема). Значение бита переноса СF в результате не учитывается.

 

Ответ: при сложении десятичных чисел -110 + 110 получается 010, которое входит в диапазон восьмиразрядной сетки -12810 … 0 … +12710. Результат 0000 00002 верный.

 

 2.4.1.2. Арифметическое сложение шестнадцатеричных чисел

 

Арифметические сложение шестнадцатеричных чисел выполняется по правилам, применяемым в позиционных си­стемах счисления.

 

Пример:Выполнить сложение шестнадцатеричных чисел 000Eh + 0001h. Результат представить в шестнадцатиразрядной сетке.

Операция Комментарий
000Eh 0001h ------- 000Fh Сложение младших разрядов: Eh + 1h = 1410 + 110. Число 1510 не превышает старший символ Fh = 1510, поэтому не возникает переполнения разряда и переноса единицы в следующий (более старший левый) разряд. Результат:  1510 = Fh.

Ответ: 000Fh + 0001h = 0010h.

 

Пример: Выполнить сложение шестнадцатеричных чисел 000Fh + 0001h. Результат представить в шестнадцатиразрядной сетке.

Операция Комментарий
1 000Fh 0001h ------- 0010h Сложение младших разрядов: Fh + 1h = 1510 + 110 = 1610. Число 1610 превышает старший символ Fh = 1510, поэтому возникает переполнение разряда и перенос единицы в следующий (более старший левый) разряд. В текущем разряде остается разность 1610 – 1610 = 0. Результат:  1610 = 10h.

Ответ: 000Fh + 0001h = 0010h.

 

Пример: Выполнить сложение шестнадцатеричных чисел 000Fh + 000Fh. Результат представить в шестнадцатиразрядной сетке.

Операция Комментарий
1 000Fh 000Fh ------- 001Еh Сложение младших разрядов: Fh + Fh = 1510 + 1510 = 3010. Число 3010 превышает старший символ Fh = 1510, поэтому возникает переполнение разряда и перенос единицы в следующий (более старший левый) разряд. В текущем разряде остается разность 3010 – 1610 = 1410 = Еh. Результат:  1610 = 10h.

Ответ: 000Fh + 000Fh = 000Еh.

 

Пример: Выполнить сложение шестнадцатеричных чисел 7FFFh+0001h в формате без знака. Результат представить в шестнадцатиразрядной сетке. Выполнить верификацию результата.

Операция Комментарий
7FFFh 0001h ------- 8000h Результат:  8000h = 3276810. Анализ: полученный результат формате без знака входит в диапазон         0 … 6553510 или 0000h … FFFFh.

Ответ: 7FFFh + 0001h = 8000h – верный, так как результат формате без знака входит в диапазон    0 … 6553510 или 0000h … FFFFh.

 

Пример: Выполнить сложение шестнадцатеричных чисел 7FFFh+0001h в формате со знаком. Результат представить в шестнадцатиразрядной сетке. Выполнить верификацию результата.

Операция Комментарий
7FFFh 0001h ------- 8000h Результат:  8000h = 3276810. Анализ: полученный результат формате со знаком не входит в диапазон    -32768 … +3276710 или 8000h … 7FFFh. Произошло переполнение разрядной сетки в дополнительном коде.

Ответ: 7FFFh + 0001h = 8000h – не верный, так как результат формате со знаком не входит в диапазон -32768 … +3276710 или 8000h … 7FFFh и произошло переполнение шестнадцатиразрядной сетки в дополнительном коде.

 

Пример: Выполнить сложение шестнадцатеричных чисел FFFFh+0001h в формате без знака. Результат представить в шестнадцатиразрядной сетке. Выполнить верификацию результата.

Операция Комментарий
1111h FFFFh 0001h ------- 0000h Результат:  0000h = 010 (перенос из старшего разряда не учитывается). Анализ: FFFFh + 0001h  = 6553610 +110 = 6553610 ≠ 0000h. Полученный результат 6553610 формате без знака не входит в диапазон 0 … 6553510 или 0000h … FFFFh. Произошло переполнение шестнадцатиразрядной сетки.

Ответ: 0000h – не верный, так как результат формате без знакf не входит в диапазон -0 … 6553510 (0000h … FFFFh) и произошло переполнение шестнадцатиразрядной сетки.

 

Пример: Выполнить сложение шестнадцатеричных чисел FFFFh+0001h в формате со знаком. Результат представить в шестнадцатиразрядной сетке. Выполнить верификацию результата.

Операция Комментарий
1111h FFFFh 0001h ------- 0000h Результат:  0000h = 010 (перенос из старшего разряда не учитывается). Анализ: FFFFh + 0001h = -110 +110 = 010 = 0000h. Полученный результат 010 формате со знаком входит в диапазон -32768 … +3276710 или 8000h … 7FFFh.

Ответ: 0000h – верный, так как результат формате со знаком входит в -32768 … +3276710 или 8000h … 7FFFh.

 

2.4.2. Арифметическое вычитание

 

Арифметическая операция вычитания выполняется по правилам вычитания (с использованием заёма из старшего значащего разряда):

0 - 0 = 02; 0 - 1 = 12; 1 - 0 = 12; 1 - 1 = 02.

При вычитании 0 - 1 = 12 производится заем в текущий бит.

 

Пример: Произвести вычитание в восьмиразрядной сетке 9710 - 7810

Порядок выполнения арифметического вычитания двоичных чисел в восьмиразрядной сетке приведен в табл.3.2.

 

Табл.2.21.          Арифметическое вычитание двух чисел 0110 00012 – 0100 11102

Система

Двоичное число

Десятичное число

Номер разряда
Заем     1→ 1+1→ ↓ 1+1→ ↓ 1+1→ ↓ 1+1 ↓      
Расчетный заем      
Уменьшаемое 1→0
Вычитаемое
Разность

Примечание.

1. Символом «↑» отмечен ближайший значащий разряд (равный единице), из которого будет выполнен первоначальный заём.

2. Символами «→» отмечены разряды, из которых выполняются последующие заёмы.

3. Символами «↓» отмечены разряды, в которые выполняются заёмы.

4. С учетом того, что вес каждого, более старшего разряда в два раза больше соседнего, то в каждый, более младший разряд, приходят две единицы (1+1=2).

Ответ: 9710 - 7810 = 0110 00012 - 0100 11102 = 0001 00112 = 1910.

 

Пример: Произвести вычитание в восьмиразрядной сетке 010 - 110

Порядок выполнения арифметического вычитания двоичных чисел в восьмиразрядной сетке приведен в табл.3.2.

Табл.2.21.               Арифметическое вычитание двух чисел 0000 00002 – 0000 00012

Система

Двоичное число

Десятичное число
Номер разряда СF
Расчетный заем  
Уменьшаемое  
Вычитаемое  
Разность   -1

Примечание. СF – разряд заема (переноса). Значение бита переноса СF в результате не учитывается.

Ответ: 010 - 110 = 0000 00002 – 0000 00012   = 111111112 = -110.

 

2.4.3. Арифметическое умножение

Арифметическое умножение одноразрядных двоичных чисел выполняется по следующим правилам:

0 ´ 0 = 0; 0 ´ 1 = 0; 1 ´ 0 = 0; 1 ´ 1 = 1.

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

Пример: Выполнить умножение 2310 ´ 1110 = 101102 ´ 10112 в двоичной системе счисления. Результат представить в восьмиразрядной и шестнадцатиразрядной сетках.

Порядок выполнения арифметического умножения двоичных чисел приведен в табл2.

 

Табл.2.22.                              Арифметическое умножение двух двоичных чисел

Двоичная

Десятичная

Комментарий
Номер разряда
        Множимое
          Множитель
        Умножение
    Умножение и сдвиг влево на 1
  - - - Умножение и сдвиг влево на 2
- - - Умножение и сдвиг влево на 3
Произведение

2310 ´ 1110 = 101112 ´ 10112 = 1111 11012 = 25310

Ответ. В восьмиразрядной сетке результат равен 1111 11012. В шестнадцатиразрядной сетке результат равен 0000 0000 1111 11012.

 

2.4.4. Арифметическое деление

Деление двоичных чисел выполняется по правилу арифметического вычитания.

Пример: Выполнить деление целых чисел 11110 : 310 = 11011112 : 112 в двоичной системе счисления.

Результат представить:

- в целочисленном формате в восьмиразрядной и шестнадцатиразрядной сетках;

- в формате с плавающей точкой (32 бита).

Порядок выполнения арифметического деления двоичных чисел приведен в таблице 2.23.1.

 

Табл.2.23.1       Арифметическое деление двух двоичных чисел 11110 : 310

 
         
       
         
       
         
           

 

 

11110 : 310 = 3710; 11011112 : 112 = 10 01012 = 3710

Ответ: 0010 01012 = 0000 0000 0010 01012.

Ответ:

1. Целочисленный результат:

1.1. В восьмиразрядной сетке 0010 01012.

1.2. В шестнадцатиразрядной сетке 0000 0000 0010 01012.

       2. Дробный результат:

       2.1. С фиксированной точкой 10 0101,12.

2.2. Нормализованное 1, 0010 112 ∙ 25.

2.3. С плавающей точкой 0 10000100 0010 1100 0000 0000 0000 000.

 

Пример: Выполнить деление целых чисел 11110 : 210 = 11011112 : 102 в двоичной системе счисления.

Результат представить:

- в целочисленном формате в восьмиразрядной и шестнадцатиразрядной сетках;

- в формате с плавающей точкой (32 бита).

Порядок выполнения арифметического деления двоичных чисел приведен в таблице 2.23.2.

 

Табл.2.23.2       Арифметическое деление двух двоичных чисел 11110 : 210

 
 

 

 

   
     
     

 

 

     
       

 

     

 

     
         
           

 

11110 : 210 = 55,510; 11011112 : 102 = 11 01112 (остаток равен 1); 11 01112  = 5510

Ответ:

1. Целочисленный результат:

1.1. В восьмиразрядной сетке 0011 01112.

1.2. В шестнадцатиразрядной сетке 0000 0000 0011 01112.

       2. Дробный результат:

       2.1. С фиксированной точкой 11 0111,12.

2.2. Нормализованное 1,1011 112 ∙ 25.

2.3. С плавающей точкой 0 10000100 1011 1100 0000 0000 0000 000.

 

2.5. Проверка результатов выполнения арифметических операций

 

Флаги состояния отражают признаки результат выполнения арифметических инструкций, таких как сложение ADD, вычитание SUB, умножение MUL, деление DIV.

Флаги состояния:

- CF — устанавливается при переносе из старшего значащего бита результата при сложении (или заёме в старший значащий бит результата при вычитании). Флаг CF показывает наличие переполнения в беззнаковой целочисленной арифметике.

- PF — устанавливается, если младший значащий байт результата содержит чётное число единичных (ненулевых) битов. Флаг ориентирован на проверку целостности данных при хранении и передаче.

- AF — устанавливается при переносе из третьего бита 3 результата при сложении (или при заёме в третий  бит результата при вычитании). Этот флаг ориентирован на использование в двоично-десятичной арифметике (BCD - binary coded decimal) .

- ZF — устанавливается, если результат равен нулю. Флаг ориентирован на проверку результата на ноль при организации циклов.

- SF — равен значению старшего значащего бита результата. Флаг SF используется для определения знака результата в знаковой арифметике.

- OF — устанавливается, если есть наличие переполнения в дополнительном коде (при переносе в старший значащий бит результата). Флаг OF показывает наличие переполнения в знаковой целочисленной арифметике.

 

Пример 1

#make_BIN#

;СЛОЖЕНИЕ 8000h + 7FFFh

;+++++++++++++++++++++++

MOV AX, 08000h

MOV BX, 07FFFh

ADD AX, BX

 HLT

 

Результат

FFFFh

Флаги CF ZF SF OF PF AF
Значение флага

 

Анализ результата

UNSIGNED

SIGNED

    SF=1 Отрицательный
CF=0 Нет переполнения OF=0 Нет переполнения
Операция 32768+32767=65535 Операция -32768+32767=-1
Вывод Результат 65535 верный Вывод Результат -1 верный

 

Пример 2

#make_BIN#

;СЛОЖЕНИЕ FFFFh + 0001h

;+++++++++++++++++++++++

MOV AX, 0FFFFh

MOV BX, 00001h

ADD AX, BX

 

Результат

0000h

Флаги CF ZF SF OF PF AF
Значение флага

Анализ результата

UNSIGNED

SIGNED

    SF=0 Положительный
CF=1 Есть переполнение OF=0 Нет переполнения
Операция 65535 + 1 = 0 Операция -1+1=0
Вывод Результат 0 неверный, т.к. 65535 + 1 = 65536 Вывод Результат 0 верный

 

Пример 3

#make_BIN#

;СЛОЖЕНИЕ 07FFFh + 00001h

;+++++++++++++++++++++++

MOV AX, 07FFFh

MOV BX, 00001h

ADD AX, BX

 

Результат

8000h

Флаги CF ZF SF OF PF AF
Значение флага

Анализ результата

UNSIGNED

SIGNED

    SF=1 Отрицательный
CF=0 Нет переполнения OF=1 Есть переполнение
Операция 32767 + 1 = 32768 Операция 32767 + 1 = -32768
Вывод Результат 32768 верный. Вывод Результат -32768 неверный, т.к. 32767 + 1 = 32768

 

Пример 4

#make_BIN#

;СЛОЖЕНИЕ 8000h + 8000h

;+++++++++++++++++++++++

MOV AX, 08000h

MOV BX, 08000h

ADD AX, BX

 

Результат

0000h

Флаги CF ZF SF OF PF AF
Значение флага

 

Анализ результата

UNSIGNED

SIGNED

    SF=0 Положительный
CF=1 Есть переполнение OF=1 Есть переполнение
Операция 32768 + 32768 = 0 Операция -32768 + -32768 = 0
Вывод Результат 0 неверный, т.к. 32768 + 32768 = 65536 Вывод Результат 0 неверный, т.к. -32768 + -32768 = -65536

 

;+++++++++++++++++++++++

Пример 5

#make_BIN#

;ВЫЧИТАНИЕ 8000h - 8000h

;-----------------------

MOV AX, 08000h

MOV BX, 08000h

SUB AX, BX

 

Результат

0000h

Флаги CF ZF SF OF PF AF
Значение флага

 

Анализ результата

UNSIGNED

SIGNED

    SF=0 Положительный
CF=0 Нет переполнения OF=0 Нет переполнения
Операция 32768 - 32768 = 0 Операция 32768 - (-32768) = 0
Вывод Результат 0 верный. Вывод Результат 0 верный

 

Пример 6

#make_BIN#

;ВЫЧИТАНИЕ 8000h - 8001h

;-----------------------

MOV AX, 08000h

MOV BX, 08001h

SUB AX, BX

 

Результат

FFFFh

Флаги CF ZF SF OF PF AF
Значение флага

 

Анализ результата

UNSIGNED

SIGNED

    SF=1 Отрицательный
CF=1 Есть переполнение OF=0 Нет переполнения
Операция 32768 – 32769 = 65535 Операция -32768 - (-32767) = -1
Вывод Результат 65535 неверный, т.к. 32768 – 32769 = -1 Вывод Результат -1 верный

 

Пример 7

#make_BIN#

;ВЫЧИТАНИЕ 8000h - 7FFF h

;-----------------------

MOV AX, 08000h

MOV BX, 07FFFh

SUB AX, BX

 

Результат

0001h

Флаги CF ZF SF OF PF AF
Значение флага

 

Анализ результата

UNSIGNED

SIGNED

    SF=0 Положительный
CF=0 Нет переполнения OF=1 Есть переполнение
Операция 32768 – 32767 = 1 Операция -32768 – 32767 = 1
Вывод Результат 1 верный. Вывод Результат 1 неверный, т.к. -32768 – 32767 = -65535

 

Пример 8

#make_BIN#

;ВЫЧИТАНИЕ 7FFFh  - 8000h

;-----------------------

MOV AX, 07FFFh

MOV BX, 08000h

SUB AX, BX

 

Результат

FFFFh

Флаги CF ZF SF OF PF AF
Значение флага

 

Анализ результата

UNSIGNED

SIGNED

    SF=1 Отрицательный
CF=1 Есть переполнение OF=1 Есть переполнение
Операция 32767 – 32768 = 65535 Операция 32767 - (-32768) = -1
Вывод Результат 65535 неверный, т.к. 32767 – 32768 = -1 Вывод Результат -1 неверный, т.к. 32767 - (-32768) = 65535

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.