Арифметические действия и коды чисел

Двоичная система счисления

Столь привычная для нас десятичная система оказалась неудобной для ЭВМ. Если в механических вычислительных устройствах, использующих десятичную систему, достаточно просто применить элемент со множеством состояний (колесо с девятью зубьями), то в электронных машинах надо было бы иметь 10 различных потенциалов в цепях. Наиболее просто реализуются элементы с двумя состояниями - триггеры. Поэтому естественным был переход на двоичную систему, т.е. систему по основанию 2. В этой системе всего две цифры - 0 и 1. Каждая цифра называется двоичной (от английского binary digit - двоичная цифра). Сокращение от этого выражения (bi nary digi t, bit) привело к появлению термина бит, ставшего названием разряда двоичного числа. Веса разрядов в двоичной системе изменяется по степеням двойки. Поскольку вес каждого разряда умножается либо на 1, либо на 0, то в результате значение числа определяется как сумма соответствующих значений степеней двойки. Ниже в таблице показаны значения весов для 8-pазpядного числа (1 байт).

Номер разряда                
Степень двойки 2+7 2+6 2+5 2+4 2+3 2+2 2+1 2+0
Значение позиции                

Если разряд двоичного числа равен 1, то он называется значащим разрядом. Ниже показан пример накопления суммарного значения числа за счет значащих битов:

Двоичное число 1 0 0 1 0 0 0 1
Степень двойки 128 64 32 16 8 4 2 1
Значения, входящие в сумму 128 + 16 + 1
Значение числа  

Нетрудно догадаться, что максимальное значение двоичного числа ограничено числом его разрядов и определяется по формуле M=2n-1, где n -число разрядов. В вычислительной технике эти числа имеют фиксированные значения 4, 8, 16, 32 и т.д., а соответствующие им числа будут иметь следующие максимальные значения:

Количество разрядов Максимальное значение числа Название числа
    Полубайт
    Байт
    Слово
    Двойное слово

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

0 + 0 = 0

0 + 1 = 1

1 + 0 = 1

1 + 1 = 0 + перенос=1

Примеры.

11010 10111

+10010 +1000

101100 11111

Для упрощения аппаратных средств современных вычислительных машин их арифметические устройства не содержат специальных схем выполнения вычитания. Эта операция производится тем же устройством, которое выполняет сложение, т.е. сумматором. Но для этого вычитаемое должно быть преобразовано из прямого кода, с которым мы познакомились выше, в специальный код. Ведь в десятичной системе тоже приходится преобразовывать числа: сравните: 13 - 5 и 13 + (-5). Такой обратный код в двоичной системе получают путем изменения в числе всех разрядов на противоположные - операции инвертирования. Например, инвертирование числа 0101 даст число 1010. Опыт выполнения операций над числами в обратном коде показал, что они требуют ряда дополнительных преобразований, неизбежно ведущих к усложнению аппаратных средств. Поэтому широкого распространения этот код не получил.

При выполнении математических действий результат может получиться не только положительным, но и отрицательным. Как же представить знак минус в схемах машины, если в них фиксируется лишь два состояния - 1 и 0? Договорились знак числа определять самым левым битом. Если число положительное, то этот бит (знаковый) равен нулю (сброшен), если отрицательное - единице (установлен). Решение о введении знакового разряда сказалось на максимальных величинах представляемых чисел. Максимальное положительное 16-битное число равно +32767, а отрицательное –32768. Оказалось, что наиболее удобно оперировать двоичными данными в дополнительном коде. Единственная сложность - надо прибавить единицу к обратному коду числа - получится дополнительный код.

Десятичное число Прямой код Обратный код Дополнительный код
-8 - -  
-7      
-6      
-5      
-4      
-3      
-2      
-1      
-0      
+0      
       
       
       
       
       
       
       

В таблице приведены десятичные числа и их двоичные представления в трех различных формах. Интересно в ней вот что. Если начать счет с числа 1000 (-8) и двигаться вниз по столбцам, то в дополнительном коде каждое последующее число получается прибавлением единицы к предыдущему без учета переноса за пределы четвертого разряда. Так просто эту операцию в прямом и обратном кодах не осуществить. Эта особенность дополнительного кода и явилось причиной предпочтительного применения его в современных ЭВМ.

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

+2 0010 -2 1110

+ + + +

+5 0101 -6 1010

               
     
 
 
   
 


+7 0111 -8 1000

+5 0101 +3 0011

+ + + +

-4 1100 -7 1001

               
   
     
     
 


+1 0001 -4 1100

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

Подытоживая наше знакомство с дополнительным кодом, обобщим величину десятичного значения числа в дополнительном коде. Так как вес старшего, т.е. значащего разряда в данном случае равен –2n-1, а не +2n-1, как в прямом коде, то диапазон представления чисел охватывает значения от –2n-1 до +2n-1-1.

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

Множимое Множитель Произведение
     
     
     
     

Другими словами, процедура умножения сводится к записи 0, если разряд множителя равен 0, или 1, если разряд =1.

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

Для деления чисел со знаком в дополнительном коде существует несколько методов. Простейший из них - преобразование чисел в положительные с последующим восстановлением знака результата. При наладке аппаратных средств (программ BIOS и т.д.) и написании новых программ (особенно на языках низкого уровня типа ассемблера) часто возникает необходимость заглянуть в память машины, чтобы оценить ее текущее состояние. Но там все заполнено длинными последовательностями нулей и единиц, очень неудобных для восприятия. Кроме того, естественные возможности человеческого мышления не позволяют оценить быстро и точно величину числа, представленного, например, комбинацией из 16 нулей и единиц. Для облегчения восприятия двоичного числа решили разбить его на группы разрядов, например, по три или четыре разряда. Эта идея оказалась удачной, так как последовательность из 3 бит имеет 8 комбинаций, а последовательность из 4 бит - 16 комбинаций. Числа 8 и 16 - степени двойки, поэтому легко находить соответствие между двоичными числами. Развивая эту идею, пришли к выводу, что группы разрядов можно закодировать, сократив при этом последовательность знаков. Для кодировки трех битов (триад) требуется 8 цифр, и поэтому взяли цифры от 0 до 7 десятичной системы. Для кодировки четырех битов (тетрад) необходимо 16 знаков, и взяли 10 цифр десятичной системы и 6 букв латинского алфавита: A, B, C, D, E, F. Полученные системы, имеющие в основании 8 и 16, назвали соответственно восьмеричной и шестнадцатеричной.

Десятичное Восьмеричное Триады Шестнадцатеричное Тетрада
    000 000    
    000 001    
    000 010    
    000 011    
    000 100    
    000 101    
    000 110    
    000 111    
    001 000    
    001 001    
    001 010    
    001 011 A  
    001 100 B  
    001 101 C  
    001 110 D  
    001 111 E  
    010 000 F 1 0000

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

16-pазpядное двоичное число со знаковым разрядом можно представить 6-pазpядным восьмеричным, причем старший байт в нем будет принимать значения лишь 0 или 1. В шестнадцатеричной системе такое число займет 4 разряда.

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

1100 0011 1101 0110 1 100 011 111 010 110

C 3 D 6 1 4 1 7 2 6

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

Также просто осуществляется и обратное преобразование. Для этого каждую цифру восьмеричного или шестнадцатеричного числа заменяют группой из 3 или 4 бит.

Например:

A B 5 1 1 7 7 2 0 4

1010 1011 0101 0001 1 111 111 010 000 100

Арифметические операции над числами в восьмеричной или шестнадцатеричной системах проводятся по тем же правилам, что и в десятичной системе. Только надо помнить, что если имеет место перенос, то он производится не после 10, а после 8 или 16.

Например:

C 0A 5

+ 2 4 8 6

 
 


E 5 2 B


перенос

Для перевода из десятичной системы в другую систему обычно применяется метод последовательного деления исходного числа на основание системы счисления, в которую переводится число. Полученный остаток после первого деления является младшим разрядом нового числа. Образовавшееся частное снова делится на основание. Из остатка получаем следующий разряд и т.д. Например:

212 2

212 106 2

0 106 53 2

0 52 26 2

1 26 13 2

0 0 12 6 2

1 6 3 2

0 2 1 (старший разряд)

21210 = 110101002

А теперь переведем десятичное число 31318 в восьмеричную систему:

31318 8

31312 3914 8

6 3912 489 8

2 488 61 8

1 56 7 (старший разряд)

5

3131810 = 751268

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

2638 16 0.7516 = 12

2624 164 16

14 160 10 (старший разряд целой части)

2638.7510 = A4E.C16


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: