Дифференцирование отрицательного числа дополнения 2 и соответствующего положительного числа - PullRequest
0 голосов
/ 02 июня 2018

Я разрабатываю на следующих примерах.4-битное двоичное представление десятичного числа 5 - 0101. Таким образом, десятичное число -5 представляется в дополнении 2 как 1011. Однако 1011 также является двоичным представлением десятичного числа 11. Как можно дифференцировать эти два?

Если решение состоит в том, чтобы ограничить 4-битные двоичные числа только от -8 до +7, как определяется переполнение?Когда я добавляю двоичный 7 к двоичному 7, я получаю 1110, который является десятичным 13 (переполнение), но также двоичный -2 в дополнении 2.Как определить, что двоичный 7 + 7 - переполнение, а не -2?

Я понимаю, что компьютеры обычно используют дополнение 2 для представления отрицательных чисел.Я хочу знать, как эта проблема решается в этом контексте.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Невозможно присвоить разные значения одной и той же последовательности бит, просто глядя на эти биты.Невозможно различить, представляет ли байт 11111111 со знаком -1 или без знака 255, так же как невозможно определить, представляет ли байт 00100001 число 33 или символ 'A'.Это разные интерпретации одних и тех же базовых данных.То, как это происходит в реальном мире, - это идея типов , которая поддерживается некоторым образом почти на любом языке высокого уровня.Тип - это то, что позволяет выбрать одну интерпретацию среди других.Во многих новых и высокоуровневых языках даже не существует простого способа интерпретировать одни и те же данные (байты) каким-либо другим способом;в некоторых языках более низкого уровня (таких как C или C ++) вы можете сделать это, если у вас есть для этого веская причина.Например, вы можете взять число 5217737203189443684 типа 8-байтового целого числа с шестнадцатеричным представлением 0x48 69 20 57 6F 72 6C 64 и заново интерпретировать его как последовательность символов "Hi World".Есть несколько случаев, когда такие уловки дают преимущества, но в большинстве случаев это не то, что вы должны делать (и именно поэтому вы не можете сделать это легко во многих языках).

Итак, возвращаясь к вашему примеру, многие языки имеют разные типы для «целых чисел со знаком» и «целых чисел без знака», и это то, что позволяет различать эти случаи.И что касается переполнения, одно приятное свойство дополнения 2 состоит в том, что на уровне битов логика сложения и вычитания фактически одинакова для «целых чисел без знака» и «целых чисел дополнения со знаком 2».Поэтому на аппаратном уровне все, что требуется, это обнаружить переполнение, установить соответствующие флаги ( флаг переполнения и флаг переноса ), а затем оставить их интерпретацию для пользователя.Это было -127 + -127 или 129 + 129?Аппаратные средства не заботятся.Это было -1 + 2 или 255 + 2?Опять же аппаратное обеспечение не волнует.Он просто устанавливает флаги и позволяет вам (или компилятору) интерпретировать это в соответствии с (логически) назначенным типом.

PS доступны некоторые подробности о флагах переполнения и переноса здесь

0 голосов
/ 02 июня 2018

Невозможно провести различие между положительным числом и отрицательным числом с одинаковым представлением.Я создал несколько программ, в которых использовал эту двусмысленность, чтобы выполнить работу.Как вы говорите, обычная процедура состоит в том, чтобы сказать, что двоичное число, старший бит которого (MSB) равен 1, чтобы быть отрицательным, а старший бит 0 должен быть положительным.Для четырех битов, которые дают диапазон от -8 до + 7.

Кроме того, один из способов, с помощью которого ЦП может обнаружить переполнение, состоит в сравнении переносного бита , который поступает в MSB, и одногоэто выходит из MSB.Если эти биты одинаковы - оба равны нулю или оба равны одному, то переполнения не было.Если эти биты разные - один равен нулю, а другой - один, то при добавлении произошло переполнение.

В вашем примере 7 плюс 7 или 0111 + 0111 обратите внимание, что при добавленииОт 111 до 111 (значения исключая MSB) вы получаете 1110, поэтому в результате получается 110 с битом переноса 1 в MSB.Затем, когда вы добавляете MSB и перенос, вы видите 0+0+1, который равен 1 и не имеет переноса MSB.Таким образом, перенос - 1, перенос - 0, поэтому произошел переполнение.

Многие процессоры обнаруживают такие ситуации.После добавления один бит состояния будет битом переноса в MSB, а другой будет битом переноса из MSB.Флаг условия переполнения повышается, если эти биты различаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...