Опубликован: 21.06.2011 | Доступ: свободный | Студентов: 2778 / 785 | Оценка: 4.02 / 4.11 | Длительность: 13:28:00
ISBN: 978-5-9556-0123-6
Специальности: Разработчик аппаратуры
Лекция 11:

Двоичные числа и двоичная арифметика

< Лекция 10 || Лекция 11: 123 || Лекция 12 >

Двоичная арифметика

Правила двоичной арифметики

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

В простейшем случае, для одноразрядных чисел, правила двоичного сложения имеют вид:

\begin{array}{r}
_{+ }0\\
  0\\
  \cline{1-1}
  0\\
\end{array}\;\;\;
\begin{array}{r}
_{+ }0\\
  1\\
  \cline{1-1}
  1\\
\end{array}\;\;\;
\begin{array}{r}
_{+ }1\\
  0\\
  \cline{1-1}
  1\\
\end{array}

При сложении ( 1+1 ) возникает два случая:

  1. когда входной перенос равен 0, получаем 0+1+1=2_{10}=10_{2}:
    \text{выходной перенос в следующий разряд}\\
\begin{array}{rrrrl}
	&	&\downarrow	&	&\\
	&	&1	& 0	&\gets \text{ входной перенос из предыдущего разряда}\\
	&	&	&_{+}1	&\\
	&	&	& \underline{1}	&\\
	&	&1	& 0	&\\
	&	&\uparrow	&	&\\
\end{array}\\
  2. когда входной перенос равен 1, получаем 1+1+1=3_{10}=11_{2}:
    \text{выходной перенос в следующий разряд}\\
\begin{array}{rrrrl}
	&	&\downarrow	&	&\\
	&	&1	& 1	&\gets \text{ входной перенос из предыдущего разряда}\\
	&	&	&_{+}1	&\\
	&	&	& \underline{1}	&\\
	&	&1	& 1	&\\
	&	&\uparrow	&	&\\
\end{array}\\
\text{новый разряд суммы, образовавшийся в результате переноса}

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

\text{выходной перенос из старшего разряда}\\
\begin{array}{rrrrrrrrl}
	&\downarrow	&	&	&	&	&	&	&\\
	& 1	&  1	&1	&1	&1	&1	&	&\gets\text{ перенос}\\
	&	&_{+}1	&1	&1	&1	&0	&1	&=61	\\
	&	&	&0	&1	&1	&1	&1	&=15	\\
	\cline{2-8}
	& 1	& 0	&0	&1	&1	&0	&0	&\gets\text{ }сумма = 76\\
	& \uparrow	&	&	&	&	&	&	&	\\
\end{array}\\
\text{дополнительный разряд суммы, образовавшийся в результате переноса}
\begin{array}{rrrrrrrl}
 	&  	&1	&	&1	&1	&	&\gets\text{ перенос }\\
	&_{+}1	&0	&1	&0	&0	&1	&=41\\
	&	&0	&1	&0	&1	&1	&=11\\
	\cline{2-7}
 	& 1	&1	&0	&1	&0	&0	&\gets\text{ }сумма =52\\
\end{array}

Двоичное вычитание

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

\begin{array}{rrrrrrrr}
_{-}0	&	&_{-}1	&	&_{-}1	&	&_?	&0 \\
\underline{0}	&	& \underline{0}		&	& \underline{1}		&	&	&\underline{1} \\
  0	&	& 1		&	& 0		&	&	&1 \\
\end{array}

Когда производится вычитание ( 0 - 1 ) осуществляется займ из более старшего разряда. Знак вопроса означает, что разряд уменьшаемого изменяется в результате займа по правилу:

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

Рассмотрим несколько примеров вычитания многоразрядных чисел (из большего числа вычитается меньшее).

\begin{array}{rrrrrrrrl}
	& 	&  0	&1	&1	&1	&	&	&\gets\text{ изменение уменьшаемого в результате займа}\\
	&	&_{-}1	&0	&0	&0	&0	&1	&=33\\
	&	&	&0	&1	&0	&1	&1	&=11\\
	\cline{3-8}
	& 	& 0	&1	&0	&1	&1	&0	&\gets\text{ разность=22}\\
\end{array}
\begin{array}{rrrrrrrrl}
	& 	&  0	&1	&0	&1	&1	&	&\gets \text{изменение уменьшаемого в результате займа}\\
	&	&_{-}1	&0	&1	&0	&0	&0	&=40\\
	&	&	&1	&1	&0	&1	&1	&=27\\
	\cline{3-8}
	& 	& 0	&0	&1	&1	&0	&1	&\gets \text{ }разность=13\\
\end{array}

Очевидно, что как в десятичном, так и в двоичном коде, складывать значительно проще, чем вычитать. Поэтому большое распространение получила двоичная арифметика с учетом знаков чисел, где вычитание заменяется сложением чисел с учетом их знака. При этом уже не имеет значения соотношение чисел между собой, какое из них больше - вычитаемое или уменьшаемое. Знак разности получается автоматически.

Двоичная арифметика с учетом знаков чисел

Прямой, обратный и дополнительный коды

В двоичном коде знак числа представляет собой разряд, приписываемый слева от значащих разрядов числа. Знак " + " обозначается логическим 0, знак " - " - логической 1. Для наглядности все примеры будем рассматривать для целых чисел, отделяя знаковый разряд точкой.

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

Так, в восьмиразрядном формате


Обратный код (ОК) для положительных чисел совпадает с прямым, т.е. к значащим разрядам приписывается знаковый разряд. Для отрицательных чисел значащие разряды инвертируются (нули заменяются на единицы, единицы - на нули), после чего приписывается знак.

Для того же числа обратный код имеет вид: (+ 10) = 0.0001010, (-10)=1.1110101.

Недостатком обратного кода является то, что одно и то же число (+0) и (-0) записывается по-разному: (+ 0) = 0.0000000, (-0)=1.1111111, что может вызвать нежелательное разночтение работы логической схемы. Поэтому предпочтительным является дополнительный код.

Дополнительный код (ДК) для положительных чисел совпадает с обратным и прямым, т.е. к значащим разрядам приписывается знаковый разряд. Для отрицательных чисел дополнительный код на 1 больше, чем обратный. После образования значащих разрядов приписывается знаковый разряд.

Для значащих разрядов отрицательного числа справедлива формула:

ДК=ОК+1. ( 11.3)

Напишем число (-0) в 7-разрядном дополнительном коде:

\begin{array}{rrrrrrrrrl}
	&	&_{ }0	&0	&0	&0	&0	&0	&0	&\gets ПК \\
	&	&_{+}1	&1	&1	&1	&1	&1	&1	&\gets ОК \\
	&	&		&	&	&	&	&	&1	& \\
	\cline{3-9}
\text{выходит за принятый формат и теряется }\to 
        & \fbox{1}	&0		&0	&0	&0	&0	&0	&0	&\gets ДК \\
\end{array}

Таким образом в дополнительном коде (+0)=(-0), следовательно, указанный недостаток обратного кода преодолен.

Рассмотрим образование дополнительного кода для числа 10. Для положительного числа (+ 10) = 0.0001010, а для отрицательного числа (-10) дополнительный ко д получается следующим образом:

\begin{array}{rrrrrrrrrl}
	&	&_{ }0	&0	&0	&1	&0	&1	&0	&\gets ПК\\
	&	&_{+}1	&1	&1	&0	&1	&0	&1	&\gets ОК\\
	&	&	&	&	&	&	&	&1	&\\
	\cline{3-9}
\text{приписываем знак числа}\to	&1.	&1	&1	&1	&0	&1	&1	&0	&\gets ДК
\end{array}

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

Двоичная арифметика в дополнительном коде

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

  1. перевести десятичные числа в двоичный код;
  2. уравнять форматы полученных двоичных чисел;
  3. если знаки чисел одинаковые, добавить по одному резервному нулю слева от каждого числа во избежание переполнения;
  4. получить дополнительные коды чисел;
  5. приписать знаковые разряды;
  6. сложить полученные коды по правилам двоичного сложения;
  7. перенос из знакового разряда (если он есть) отбросить;
  8. результат получен в дополнительном коде, поэтому для проверки значащих разрядов отрицательного числа необходимо сделать вычисления, противоположные формуле (11.3): сначала вычислить обратный код по формуле ОК=ДК-1, после чего произвести инверсию полученного числа.

Для наглядности возьмем два десятичных числа, например, 20 и 55, и сделаем все возможные варианты вычислений:

  • 20 + 55 = (+20) + (+55) = + 75.
    \text{резервный разряд во избежание переполнения}\\
\begin{array}{rrrrrrrrl}
	&\downarrow	&	&	&	&	&	&	&\\
	&1	&1	&	&1	&	&	&	&\gets перенос\\
_{+}0.	&0	&0	&1	&0	&1	&0	&0	&=+20\\
 0.	&0	&1	&1	&0	&1	&1	&1	&=+55\\
 \cline{1-8}
 0.	&1	&0	&0	&1	&0	&1	&1	&\gets результат\\
        \uparrow	&	&	&	&	&	&	&	&
\end{array}\\
\text{знаковый разряд положительного числа}

    Число положительное, поэтому ОК=ПК, для проверки числа нужно перевести его значащие разряды в десятичный код по (П3-2): 1001011_{2} =1+2+8+64= 75.

  • 20 - 55 = (+20) + (-55) = - 35. Сначала получим дополнительный код отрицательного числа (-55):
    \begin{array}{rrrrrrrrl}
	&	&_{ }1	&1	&0	&1	&1	&1	&\gets ПК \\
	&	&_{+}0	&0	&1	&0	&0	&0	&\gets ОК \\
	&	&	&	&	&	&	&1	&\\
\cline{3-8}
\text{приписываем знак числа}\to	&1.	& 0	&0	&1	&0	&0	&1	&\gets ДК \\
\end{array}

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

    \begin{array}{rrrrrrrl}
_{+}0.	&0	&1	&0	&1	&0	&0	&=+20\\
 1.	&0	&0	&1	&0	&0	&1	&=-55\\
 \cline{1-7}
 1.	&0	&1	&1	&1	&0	&1	&\gets результат\\
 \uparrow     	&	&	&	&	&	&	&\\
\end{array}\\
\text{знаковый разряд отрицательного числа}

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

    \begin{array}{rrrrrrl}
_{-}0	&1	&1	&1	&0	&1	&\gets ДК \\
  	&	&	&	&	&1	&\\
  0	&1	&1	&1	&0	&0	&\gets ОК\\
  \cline{1-6}
  1	&0	&0	&0	&1	&1	&\gets ПК,\\
\end{array}

    а затем уже перевести его в десятичный код по (П3-2): 100011 _{2} =1+2+32= 35.

  • -20 + 55 = (-20) + (+55) = + 35 - Сначала получим ДК отрицательного числа (-20).
    \begin{array}{rrrrrrrrl}
	&	&_{  }0	&1	&0	&1	&0	&0	&\gets ПК\\
	&	&	&	&	&1	&1	&	&\gets\text{перенос при вычислении ДК}\\
	&	&_{+}1	&0	&1	&0	&1	&1	&\gets\text{ОК}\\
	&	&	&	&	&	&	&1	&\\
	\cline{3-8}
\text{приписываем знак числа}\to &1.	& 1	&0	&1	&1	&0	&0	&\gets\text{ДК}\\
\end{array}

    После этого произведем вычисления:

    \text{перенос из знакового разряда (отбрасывается)}\\
\begin{array}{clrrrrrrl}
\downarrow &	&	&	&	&	&	&	&\\
   \fbox{1}  	&1	& 1	&1	&1	&	&	&	&\getsперенос\\
_{+}	&1.	& 1	&0	&1	&1	&0	&0	&= -20\\
	&0.	& 1	&1	&0	&1	&1	&1	&= +55\\
\cline{3-8}
	&0.	&1	&0	&0	&0	&1	&1	&\getsрезультат\\
	&\uparrow  	&	&	&	&	&	&	&\\
\end{array}\\
\text{знаковый разряд положительного числа}

    Получено положительное число, поэтому ДК=ПК, для проверки результата нужно только перевести значащие разряды в десятичный код: 100011_{2} =1+2+32= 35.

  • -20 - 55 = (-20) + (-55) = - 75 - Сначала получим дополнительный код отрицательных чисел. Для числа (-20) он получается следующим образом:
    \text{резервный разряд во избежание переполнения}\\
\begin{array}{rccrrrrrrl}
	&	&\downarrow	&	&	&	&	&	&	&\\
	&	&\fbox{0}	&0	&1	&0	&1	&0	&0	&\gets\text{ПК}\\
	&	&\fbox{\phantom{1}}	&	&	&	&1	&1	&	&\gets\text{перенос при вычислении ДК}\\
	&_{+}	&\fbox{1}	&1	&0	&1	&0	&1	&1	&\gets\text{ОК}\\
	&	&\fbox{\phantom{1}}	&	&	&	&	&	&1	&\\
\cline{3-9}
\text{приписываем знак числа}\to	&1.	&\fbox{1}	&1	&0	&1	&1	&0	&0	&\gets\text{ДК}\\
\end{array}

    А для числа (-55) -

    \text{резервный разряд во избежание переполнения}\\
\begin{array}{rccrrrrrrl}
	&				&	    \downarrow	&	&	&	&	&	&	&\\                
	&				&	    \fbox{0}		&1	&1	&0	&1	&1	&1	&\gets ПК\\
	&_{+}			&	    \fbox{1}		&0	&0	&1	&0	&0	&0	&\gets ОК\\
	&				&	    \fbox{\phantom{1}}		&	&	&	&	&	&1	&\\                
\cline{3-9}                                                          
\text{приписываем знак числа}\to	& 1. & \fbox{1}		&0	&0	&1	&0	&0	&1	&\gets ДК\\
\end{array}

    Сложим полученные числа в том же формате:

    \begin{array}{c}
\begin{array}{rllllllllll}
\text{перенос из знака (игнорируется)} \to	&\fbox{1}	&1	&	&	&1	&	&	&	&	&\gets перенос\\
	&_{+}	&1.	& 1	&1	&0	&1	&1	&0	&0	&=-20\\
	&	& 1.	& 1	&0	&0	&1	&0	&0	&1	&=-55\\
\cline{4-10}
	&	&1.	&0	&1	&1	&0	&1	&0	&1	&\gets результат\\
	&	&\uparrow     	&	&	&	&	&	&	&	&\\
\end{array}\\
\text{знаковый разряд отрицательного числа}
\end{array}

    Поскольку число отрицательное, ДК\neПК. Для проверки значащих разрядов числа нужно сначала вычислить обратный код, после чего перевести его в прямой код инверсией -

    \begin{array}{clllllll}
_{-}0	&1	&1	&0	&1	&0	&1	&\gets ДК\\
  	&	&	&	&	&	&1	&\\
  0	&1	&1	&0	&1	&0	&0	&\gets ОК\\
\cline{1-7}
  1	&0	&0	&1	&0	&1	&1	&\gets ПК.\\
\end{array}\\

    И только после этого полученное число проверяется переводом в десятичный код по (11.2): 1001011_{2} =1+2+8+64= 75.

< Лекция 10 || Лекция 11: 123 || Лекция 12 >