ТА. 2. Машинная арифметика с фиксированной точкой. Форматы хранения данных. Машинная арифметика
Арифметические операции в двоичной системе счисления

Умножение в двоичной системе счисления = поразрядные сдвиги + суммирование
Основные форматы хранения целых чисел со знаком. Прямой код
Знак = (-1)∙s
![]()
Диапазон представления в зависимости от формата:
Однобайтовый (абс. величина)
1112
Двухбайтовый (абс. величина)
0000– 1111
0 –
Четырехбайтовый (абс. величина)
000000–
111111
0 – 2
Прямой, обратный и дополнительный код.
Прямой код числа в двоичной системе счисления совпадает по изображению с записью самого числа в двоичной системе счисления. Знаковый разряд для положительных чисел равен 0, для отрицательных чисел - 1.
Обратный код для положительного числа в двоичной системе счисления совпадает с прямым кодом.
Для отрицательного числа все цифры числа заменяются на противоположные (1 на 0, 0 на 1), а в знаковый разряд заносится единица.
Дополнительный код положительного числа в двоичной системе счисления совпадает с прямым кодом.
Для отрицательного числа дополнительный код образуется путем получения обратного кода и добавлением единицы.
Пример: -1310, прямой код: 1, обратный код: 1, дополнительный код: 1
Арифметические операции в прямом, обратном и дополнительном коде:
Разберем четыре случая, возникающих при вычислении суммы x+y. Двоичные значения в обратном коде выделены полужирным шрифтом. Единица в круглых скобках обозначает перенос разряда.
1. x≥0, y≥0. Суммируются все двоичные разряды прямого кода слагаемых, в том числе разряды знака. Например:
510+910 = +==1410.
При выполнении переноса двоичных разрядов результирующее значение может оказаться длиннее разряда, отведенного на модуль числа (n — длина представления). В этом случае старший разряд суммы переносится в разряд знака и результат окажется неправильным (сумма двух положительных чисел получится отрицательной). Такая ситуация называется переполнением разрядной сетки. При программировании ее следует избегать.
2. x≥0, y≤0. |y|>|x|. Например:
510 + (-910 ) = + = = =
3. x≥0, y≤0. |y|<|x|. Например:
910+(-510 )=+ = (1)=+310.
Здесь результат оказывается неправильным вследствие переноса из знакового разряда. Если единицу перенести в младший разряд, получим правильный ответ в прямом коде:
0000 01002 = 4 10.
4. x≤0, y≤0. Например:
(-910) + = + = (1) = -11210.
Здесь результат также неправильный вследствие переноса из знакового разряда. Если единицу перенести в младший разряд, получим правильный ответ:
2 = 0= -1410.
Рассмотрим теперь сложение чисел в дополнительных кодах. Здесь следует рассмотреть те же четыре случая, что и для обратных кодов. Двоичные значения в обратном коде выделены полужирным шрифтом, а единица в круглых скобках обозначает перенос разряда.
1. x≥0, y≥0. Суммируются все двоичные разряды прямого кода слагаемых, в том числе старшие (разряды знака). Поскольку в данном случае используется прямой код, единственная возможная проблема — переполнение разрядной сетки.
2. x≥0, y≤0. |y|>|x|. Например:
510 + (-910 ) = + = = = -410.
При преобразовании дополнительного кода в прямой знаковый разряд остается неизменным, остальные разряды инвертируются (то есть единицы заменяются нулями, и наоборот) и к младшему разряду прибавляется единица.
3. x≥0, y≤0. |y|<|x|. Например:
910 + (-510 ) = + = (1) = 410.
Здесь результат, если отбросить перенос из знакового разряда, правильный.
4. x≤0, y≤0. Например:
(-910) + (-510) = + = (1) = = -1410.
Результат также правильный.
Преобразование дробных значений между системами счисления. Перевод дробного числа из десятичной системы счисления в произвольную p-ичную:
1. умножить D10 на p;
2. целую часть произведения представить соответствующей цифрой p-ичного
представления;
3. умножать D10 на p до тех пор, пока будет достигнута требуемая точность (получится p-ичное число с k дробными разрядами) или дробная часть обратится в ноль.


