ТА. 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 дробными разрядами) или дробная часть обратится в ноль.