Подумайте о двух или трех битах, а затем поймите, что эти вещи масштабируются до 32, 64 или сколько угодно бит.
Во-первых, давайте начнем с десятичной
99
+22
===
Чтобы сделать это, у нас будет что-то вроде "Carry the one's".
11
99
+22
===
121
9 плюс 2 равно 1 нести единицу, 1 плюс 9 плюс 2 равно 2 нести единицу...
Дело в том, однако, что для добавления двух чисел мне действительно нужно три строки, по крайней мере, для некоторых из них мне может потребоваться добавить три числа. То же самое с сумматором в алюминиевом сплаве: каждый столбец или битовая дорожка, однобитовый сумматор должен иметь возможность добавлять два входа плюс бит переноса, а выход представляет собой однобитовый результат и однобитовый перенос.
Поскольку вы использовали 5 и 2, давайте сделаем 4-битную двоичную математику.
0101
+0010
=====
0111
Нам не нужно было продолжать это, но вы можете видеть, что математика сработала, 5 + 2 = 7.
И если мы хотим добавить 5 и -2
11
0101
+1110
=====
0011
И ответ 3, как и ожидалось, не очень удивительно, но у нас было выносливость. И поскольку это было сложение с минусовым числом в дополнении до двух, все это работало, тогда не было знакового бита if, дополнение до двух делает это так, что нам все равно, просто скармливайте сумматору два операнда.
Теперь, если вы хотите сделать тонкое различие, что, если вы хотите вычесть 2 из 5, вы выбираете инструкцию вычитания, а не сложения. Ну, мы все узнали, что отрицание в двойном дополнении означает инвертирование и добавление единицы. И мы видели выше, что сумматору с двумя входами действительно нужен третий вход для переноса, чтобы его можно было каскадировать до такой ширины, какой должен быть сумматор. Таким образом, вместо выполнения двух операций сложения, инвертирования и добавления 1, являющегося первым добавлением реального сложения, все, что нам нужно сделать, это инвертировать и установить перенос:
Поймите, что нет никакой логики вычитания, она добавляет негатив от того, что вы ей кормите.
v this bit is normally zero, for a subtract we set this carry in bit
11 11
0101 five
+1101 ones complement of 2
=====
0011
И что вы знаете, мы получаем один и тот же ответ... Неважно, каковы фактические значения любого из операндов. если это операция сложения, вы помещаете ноль в бит переноса и передаете его сумматору. Если это операция вычитания, вы инвертируете второй операнд, кладете единицу на перенос и передаете ее тому же сумматору. Что выпадает, то выпадает. Если в вашей логике достаточно битов для хранения результата, тогда все работает, если у вас недостаточно места, вы переполняетесь.
Существует два вида переполнения: без знака и со знаком. Без знака просто это бит переноса. Переполнение со знаком связано со сравнением бита переноса в столбце msbit с битом переноса для этого столбца. Для нашей математики выше вы видите, что перенос и перенос в этом столбце msbit одинаковы, оба равны единице. И мы узнали путем проверки, что в 4-битной системе достаточно места для правильного представления чисел +5, -2 и +3. 4-битная система может представлять числа от +7 до -8. Таким образом, если вы добавите 5 и 5 или -6 и -3, вы получите переполнение со знаком.
01 1
0101
+0101
=====
1010
Поймите, что ОДИНАКОВАЯ логика сложения используется для математики со знаком и без знака, это зависит от вашего кода, а не от логики, чтобы виртуально определить, считались ли эти биты двойным дополнением со знаком или без знака.
В приведенном выше случае 5 + 5 вы видите, что перенос в столбце msbit равен 1, но перенос равен 0, что означает, что флаг V, знаковый флаг переполнения, будет установлен логикой. В то же время перенос того бита, который является флагом переноса C, не будет установлен. Если подумать, 4 бита без знака могут содержать числа от 0 до 15, поэтому 5 + 5 = 10 не переполняется. Но если подумать, 4 бита со знаком могут содержать от +7 до -8, а 5 + 5 = 10 — это переполнение со знаком, поэтому установлен флаг V.
если/когда у вас есть сложение с инструкцией переноса, они берут ту же самую схему сумматора, и вместо того, чтобы подавать перенос в ноль, ему подается флаг переноса. Аналогично вычитанию с заимствованием, вместо подачи переноса в 1 ввод переноса представляет собой либо 1, либо 0 в зависимости от состояния флага переноса в регистре состояния.
Умножение - это совсем другая история, двоичное число делает умножение намного проще, чем при использовании десятичной математики, но у вас ДОЛЖНЫ быть разные инструкции умножения без знака и со знаком. А деление — это отдельный зверь, вот почему в большинстве наборов инструкций нет деления. У многих нет умножения из-за количества гейтов или часов, которые он сжигает.
person
old_timer
schedule
27.04.2011