Думайте в терминах двух или трех битов, а затем понимайте, что эти вещи масштабируются до 32 или 64 или сколь угодно много битов.
Сначала давайте начнем с десятичного числа
99
+22
===
чтобы сделать это, у нас будет продолжаться "Carry the one's".
11
99
+22
===
121
9 плюс 2 - это 1, но один, 1 плюс 9 плюс 2, это 2, но ... ... 1009*
Суть в том, чтобы заметить, что для добавления двух чисел мне действительно потребовалось три строки, по крайней мере для некоторых из них мне, возможно, понадобится добавить три числа.То же самое с сумматором в alu, каждый столбец или битовая дорожка, однобитный сумматор, должен иметь возможность добавлять два входа плюс бит переноса, а выход - это однобитный результат и однобитный перенос.
Поскольку вы использовали 5 и 2, давайте выполним 4-битную двоичную математику
0101
+0010
=====
0111
Нам не нужно было переносить это, но вы можете видеть, что математика сработала, 5 + 2 = 7.
И если мы хотим добавить 5 и -2
11
0101
+1110
=====
0011
И ответ будет 3, как и ожидалось, не удивительно, но у нас получилось.И так как это было добавление с минусом в двойном дополнении, все это работало, тогда не было знака бита тогда, двойное дополнение делает его таким, что нам все равно, просто подайте сумматор двум операндам.
Теперь, если выЕсли вы хотите сделать тонкую разницу, то, что если вы хотите вычесть 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, в зависимости от состояния флага переноса в регистре состояния.
Умножение - это совсем другая история, двоичный код значительно упрощает умножение по сравнению с десятичной математикой, но вы ДОЛЖНЫ иметь разные беззнаковые и подписанные инструкции умножения. А разделение - это отдельный зверь, поэтому в большинстве наборов команд нет разделения. У многих нет умножения из-за количества ворот или часов, которые он сжигает.