Организация арифметических действий в ограниченном числе разрядов. Ошибки, связанные с конечной разрядностью в целочисленной арифметике




Организация арифметических действий в ограниченном числе разрядов.

Сложение и вычитание

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

Такая запись чисел ограничивает диапазоны значений, с которыми может работать компьютер. Например, для чисел в формате байта представимы значения от –128 (–27) до 127 (27–1), для чисел в формате слова – от –32768 (–215) до 32767 (215–1), а длинные целые числа в формате двойного слова могут принимать значения из диапазона от ‑47483648 до 2147483647.

Чтобы получить внутреннее представление целого положительного числа N, хранящегося в К-разрядной ячейке, необходимо:

Перевести число N в двоичную систему счисления.

Полученный результат дополнить слева незначащими нулями до К разрядов.

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

Дополнительным кодом двоичного числа X в N-разрядной ячейке является число, дополняющее его до значения 2N.

Получение дополнительного кода:

Получить внутреннее представление положительного числа N (прямой код);

Получить обратный код этого числа заменой 0 на 1 или 1 на 0 (обратный код).

К полученному числу прибавить 1.

Использование дополнительного кода позволяет заменить операцию вычитания на операцию сложения.

A-B=A+(-B).

Процессору достаточно уметь лишь складывать числа.

Старший, К-й разряд во внутреннем представлении любого положительного числа равен 0, отрицательного числа равен 1. Поэтому этот разряд называется знаковым разрядом.

Умножение:

Выполнить умножение чисел A = 1210 и B = 910 в двоичной системе счисления.


Решение:

1) Переведем числа в двоичную систему счисления:
1210 = 1100 2
910 = 1001 2

2) Запишем числа "A" и "B" столбиком, одно под другим, начиная с младших разрядов (нумерация разрядов начинается с нуля).

 

Разр.                  
A                  
B                  

3) Умножим последовательно все разряды числа "A" на младший разряд "B" записывая результат внизу, под сомножителями, начиная с младших разрядов.

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

 

4) Таким же образом умножим последовательно все разряды числа "A" на следующий разряд "B" записывая результат внизу, под сомножителями, со сдвигом на один разряд влево.

5) Сложим полученные на последних двух шагах двоичные числа. Как это сделать можно посмотреть впримере на сложение.

Шаги 4 и 5 будем повторять до тех пор пока не исчерпаем все разряды множителя.
Весь процесс умножения наших чисел выглядит следующим образом:

 

Разр. c                  
                     
A                    
B                    
     
1100 x 1                    
1100 x 0                    
     
1100 + 0                    
1100 x 0                    
     
1100 + 0                    
1100 x 1                    
     
1100 + 1100000                    

 

Ответ: 1100 2 x 1001 2 = 1101100 2

или в десятичной системе счисления: 1210 x 910 = 10810

 

Ошибки, связанные с конечной разрядностью в целочисленной арифметике

 

При выполнении арифметических действий в целочисленной k -разрядной арифметике возможно возникновение следующих ошибок:

  • левые цифры результата, выходящие за отведенное количество разрядов, оказываются утерянными;
  • при сложении двух положительных чисел, представленных в знаковом типе данных, мы можем получить отрицательное число, если в результате сложения в левом знаковом разряде окажется единица.

Выполним сложение 100 и 51 в 8-разрядном знаковом типе. В 8-разрядном компьютерном представлении эти числа имеют следующий вид:

100 = 011001002 и 51 = 001100112.

 

При сложении этих чисел получим 100101112. Первая единица (знаковый разряд) указывает на то, что в остальных разрядах получено отрицательное число. Получим теперь значение данного отрицательного числа по его дополнительному коду. Оно в итоге равно -105.

Таким образом, 100 + 51 = -105 в 8-разрядной знаковой арифметике.

Вычислим значения факториала в широко распространенном знаковом 16-разрядном типе
Значение

7! = 1·2·3·4·5·6·7 = 5250 = 1010010000010210002


уместится в 16-ти разрядах, а значение

 

8! = 7!·8 = 10100100000102·10002 = 10100100000100002


в 16-ти разрядах уже не уместится. Для записи этого числа требуется как минимум 17 разрядов в знаковом типе. При записи значения 8! в 16 разрядов самая старшая (значащая) единица попадает в знаковый разряд и трактуется как знак отрицательного числа. Таким образом, получившееся значение соответствует отрицательному числу -25216.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: