stringtranslate.com

Дополнение до двух

Дополнение до двух — наиболее распространенный метод представления целых чисел со знаком (положительных, отрицательных и нулевых) на компьютерах [1] и, в более общем плане, двоичных значений с фиксированной запятой . В дополнении до двух двоичная цифра с наибольшим разрядом используется в качестве знака , указывающего, является ли двоичное число положительным или отрицательным. Если старший бит равен 1 , число имеет отрицательный знак; и когда старший бит равен 0, число подписывается как положительное.

В отличие от схемы дополнения до единиц , схема дополнения до двух имеет только одно представление для нуля. Более того, арифметические реализации могут использоваться как со знаковыми, так и беззнаковыми целыми числами [2] и различаются только ситуациями переполнения целых чисел.

Процедура

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

Например, чтобы вычислить десятичное число -6 в двоичном виде из числа 6 :

Чтобы убедиться, что 1010 действительно имеет значение −6 , сложите значения разрядов, но вычтите значение знака из окончательного расчета. Поскольку наиболее значимым значением является значение знака, его необходимо вычесть, чтобы получить правильный результат: 1010 = - ( 1 ×2 3 ) + ( 0 ×2 2 ) + ( 1 ×2 1 ) + ( 0 ×2 0 ) = 1 ×−8 + 0 + 1 ×2 + 0 = −6.

Обратите внимание, что шаги 2 и 3 вместе являются допустимым методом вычисления аддитивной обратной величины любого целого числа (положительного или отрицательного) , где входные и выходные данные имеют формат дополнения до двух. Альтернативой вычислениям является использование вычитания . Ниже описано вычитание целых чисел в формате дополнения до двух.

Теория

Дополнение до двух является примером дополнения по системе счисления . «Два» в названии относится к термину [ нужна цитация ] , который, полностью расширенный в N -битной системе, на самом деле равен «два в степени N» — 2 N (единственный случай, когда ровно «два» будет в этом члене N = 1 , то есть для 1-битной системы, но они не имеют емкости как для знака, так и для нуля), и только для этого полного члена вычисляется дополнение . Таким образом, точным определением дополнения до двух N -битного числа является дополнение этого числа относительно 2 N .

Определяющее свойство быть дополнением к числу по отношению к 2 N заключается в том, что суммирование этого числа с исходным дает 2 N . Например, используя двоичный код с числами до трех битов (таким образом, N = 3 и 2 N = 2 3 = 8 = 1000 2 , где ' 2 ' указывает на двоичное представление), дополнение до двух для числа 3 ( 011 2 ) равно 5 ( 101 2 ), поскольку в сумме с оригиналом получается 2 3 = 1000 2 = 011 2 + 101 2 . Там, где это соответствие используется для представления отрицательных чисел, это фактически означает использование аналогии с десятичными цифрами и числовым пространством, допускающим только восемь неотрицательных чисел от 0 до 7, разделение числового пространства на два набора: первые четыре из числа 0, 1, 2, 3 остаются прежними, а остальные четыре кодируют отрицательные числа, сохраняя порядок их возрастания, поэтому 4 кодирует -4, 5 кодирует -3, 6 кодирует -2 и 7 кодирует -1. Однако двоичное представление имеет дополнительную полезность, поскольку старший бит также указывает группу (и знак): он равен 0 для первой группы неотрицательных значений и 1 для второй группы отрицательных чисел. Таблицы справа иллюстрируют это свойство.

Вычисление дополнения двоичного числа к положительному числу по сути означает вычитание числа из 2 N . Но, как видно из трехбитного примера и четырехбитного 1000 2 ( 2 3 ), число 2 N само по себе не может быть представлено в системе, ограниченной N битами, поскольку оно находится сразу за пределами пространства N битов ( число, тем не менее, является точкой отсчета «дополнения до двух» в N -битной системе). Из-за этого системы с максимальным числом N -бит должны разбить вычитание на две операции: сначала вычесть из максимального числа в N -битной системе, то есть 2 N -1 (этот член в двоичном формате на самом деле представляет собой простое число, состоящее из ' все единицы», и вычитание из него можно выполнить, просто инвертировав все биты числа (также известное как побитовая операция НЕ ), а затем прибавив единицу. По совпадению, это промежуточное число перед добавлением единицы также используется в информатике как еще один метод представления чисел со знаком и называется дополнением единиц (названным так потому, что суммирование такого числа с оригиналом дает «все 1»).

По сравнению с другими системами представления чисел со знаком ( например, дополнением до единиц ), дополнение до двух имеет то преимущество, что фундаментальные арифметические операции сложения , вычитания и умножения идентичны операциям для беззнаковых двоичных чисел (пока входные данные представлены в том же количестве бит, что и выходной сигнал, и любое переполнение сверх этих бит отбрасывается из результата). Это свойство упрощает реализацию системы, особенно для арифметики более высокой точности. Кроме того, в отличие от систем с дополнением до единиц, дополнение до двух не имеет представления для отрицательного нуля и, следовательно, не страдает от связанных с этим трудностей. В противном случае обе схемы обладают желаемым свойством: знак целых чисел можно изменить, взяв дополнение к его двоичному представлению, но у дополнения до двух есть исключение — наименьшее отрицательное число, как видно из таблиц. [3]

История

Метод дополнений издавна использовался для выполнения вычитания в десятичных арифмометрах и механических калькуляторах . Джон фон Нейман предложил использовать двоичное представление с дополнением до двух в своем первом проекте отчета 1945 года о предложении EDVAC по созданию электронного цифрового компьютера с хранимой программой. [4] В документе EDSAC 1949 года , вдохновленном первым проектом , использовалось представление отрицательных двоичных целых чисел в виде дополнения до двух.

Многие ранние компьютеры, включая CDC 6600 , LINC , PDP-1 и UNIVAC 1107, использовали нотацию дополнения до единиц ; потомки UNIVAC 1107, серия UNIVAC 1100/2200 , продолжали делать это. Научные машины серии IBM 700/7000 используют обозначение знак/величина, за исключением индексных регистров, которые являются дополнением до двух. К ранним коммерческим компьютерам, хранящим отрицательные значения в форме двоичного дополнения, относятся English Electric DEUCE (1955 г.) и Digital Equipment Corporation PDP-5 (1963 г.) и PDP-6 (1964 г.). Система System/360 , представленная в 1964 году компанией IBM , тогда доминирующим игроком в компьютерной индустрии, сделала двоичное дополнение наиболее широко используемым двоичным представлением в компьютерной индустрии. Первый миникомпьютер, PDP-8 , представленный в 1965 году, использует арифметику с дополнением до двух, как и Data General Nova 1969 года, PDP-11 1970 года и почти все последующие миникомпьютеры и микрокомпьютеры.

Преобразование из представления с дополнением до двух

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

Значение  w N -битного целого числа определяется по следующей формуле:

Старший бит определяет знак числа и иногда называется знаковым битом . В отличие от представления знака и величины , знаковый бит также имеет вес —(2 N  — 1 ), показанный выше. Используя N бит, можно представить все целые числа от −(2 N  − 1 ) до 2 N  − 1 − 1 .

Преобразование в представление с дополнением до двух

В записи дополнения до двух неотрицательное число представляется своим обычным двоичным представлением ; в этом случае старший бит равен 0. Однако диапазон представленных чисел не такой, как у беззнаковых двоичных чисел. Например, 8-битное беззнаковое число может представлять значения от 0 до 255 (11111111). Однако 8-битное число с дополнением до двух может представлять только неотрицательные целые числа от 0 до 127 (01111111), поскольку остальные битовые комбинации со старшим битом, равным «1», представляют собой отрицательные целые числа от -1 до -128.

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

Из дополнения

Чтобы получить дополнение до двух отрицательного двоичного числа, все биты инвертируются или «переворачиваются» с помощью побитовой операции НЕ ; значение 1 затем добавляется к полученному значению, игнорируя переполнение, которое происходит при получении дополнения до двух до 0.

Например, используя 1 байт (= 8 бит), десятичное число 5 представляется как

0000 0101 2

Самый старший бит (в данном случае самый левый бит) равен 0, поэтому шаблон представляет собой неотрицательное значение. Чтобы преобразовать в −5 в записи с дополнением до двух, сначала все биты инвертируются, то есть: 0 становится 1, а 1 становится 0:

1111 1010 2

На этом этапе представление представляет собой дополнение до единиц десятичного значения -5. Чтобы получить дополнение до двух, к результату добавляется 1, что дает:

1111 1011 2

Результатом является двоичное число со знаком, представляющее десятичное значение -5 в форме дополнения до двух. Самый старший бит равен 1, поэтому представленное значение отрицательное.

Дополнением до двух отрицательного числа является соответствующее положительное значение, за исключением особого случая самого отрицательного числа . Например, инвертирование битов −5 (выше) дает:

0000 0100 2

И добавление одного дает окончательное значение:

0000 0101 2

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

Двоичное дополнение самого отрицательного числа, которое можно представить (например, единица в качестве старшего бита, а все остальные биты равны нулю), равно самому себе. Следовательно, существует «лишнее» отрицательное число, для которого дополнение до двух не дает отрицания, см. § Самое отрицательное число ниже.

Вычитание из 2 N

Сумма числа и дополнения к нему представляет собой N -битное слово со всеми 1 битами, которое (читается как беззнаковое двоичное число) 2 N − 1 . Затем добавление числа к его дополнению до двух приводит к тому, что N младших битов устанавливаются в 0, а бит переноса — в 1, причем последний имеет вес (читая его как беззнаковое двоичное число) 2 N . Следовательно, в беззнаковой двоичной арифметике значение отрицательного числа x * с дополнением до двух положительного x удовлетворяет равенству x * = 2 Nx . [а]

Например, чтобы найти четырехбитное представление −5 (нижние индексы обозначают базу представления ):

x = 5 10 , следовательно x = 0101 2

Следовательно, при N = 4 :

Икс * знак равно 2 N - Икс = 2 4 - 5 10 = 16 10 - 5 10 = 10000 2 - 0101 2 = 1011 2

Расчет можно выполнить полностью в 10-й системе счисления с преобразованием в 2-ю в конце:

Икс * знак равно 2 N - Икс знак равно 2 4 - 5 10 = 11 10 = 1011 2

Работа от LSB к MSB

Упрощенный способ ручного преобразования двоичного числа в дополнение до двух — начать с младшего значащего бита (LSB) и скопировать все нули, начиная от младшего значащего бита (MSB), пока не будет достигнута первая 1; затем скопируйте эту 1 и переверните все оставшиеся биты (оставьте старший бит равным 1, если исходное число было в знаково-значном представлении). Этот ярлык позволяет человеку преобразовать число в дополнение до двух, не формируя предварительно дополнение до единиц. Например: в представлении с дополнением до двух отрицание «0011 1100» равно «1100 0 100 », где подчеркнутые цифры не изменились в результате операции копирования (в то время как остальные цифры были перевернуты).

В компьютерных схемах этот метод не быстрее, чем метод «дополни и добавь один»; оба метода требуют последовательной работы справа налево, распространяя логические изменения. Метод дополнения и сложения можно ускорить с помощью стандартной схемы сумматора с упреждающим переносом ; метод LSB к MSB можно ускорить с помощью аналогичного логического преобразования.

Расширение знака

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

Аналогично, когда число сдвигается вправо, должен сохраняться старший бит, содержащий информацию о знаке. Однако при сдвиге влево немного смещается. Эти правила сохраняют общую семантику: сдвиг влево умножает число на два, а сдвиг вправо делит число на два. Однако если старший бит изменяется с 0 на 1 (и наоборот), считается, что происходит переполнение в том случае, если значение представляет целое число со знаком.

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

Самое отрицательное число

За одним исключением, начиная с любого числа в представлении с дополнением до двух, если все биты переворачиваются и добавляется 1, получается представление с дополнением до двух отрицательного числа этого числа. Положительное 12 становится отрицательным 12, положительное 5 становится отрицательным 5, ноль становится нулевым (+переполнение) и т. д.

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

Наличие ненулевого числа, равного его собственному отрицанию, обусловлено тем фактом, что ноль является его собственным отрицанием и что общее количество чисел четное. Доказательство: существует 2^n - 1 ненулевых чисел (нечетное число). Отрицание разделило бы ненулевые числа на наборы размером 2, но это привело бы к тому, что набор ненулевых чисел имел бы четную мощность. Таким образом, по крайней мере один из наборов имеет размер 1, т. е. ненулевое число является его собственным отрицанием.

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

В языках программирования C и C++ вышеуказанное поведение не определено и может не только возвращать странные результаты, но и компилятор может предположить, что программист позаботился о том, чтобы неопределённые числовые операции никогда не происходили, и делать выводы из этого предположения. [7] Это позволяет провести ряд оптимизаций, но также приводит к ряду странных ошибок в программах с этими неопределенными вычислениями.

Это самое отрицательное число в дополнении до двух иногда называют «странным числом» , поскольку оно является единственным исключением. [8] [9] Хотя это число является исключением, оно является допустимым числом в обычных системах с дополнением до двух. Все арифметические операции работают с ним и как операнд, и (если не было переполнения) как результат.

Почему это работает

Учитывая набор всех возможных N -битных значений, мы можем присвоить нижней (по двоичному значению) половине целые числа от 0 до (2 N  - 1 - 1) включительно, а верхней половине - −2 N  - 1. до −1 включительно. Верхняя половина (опять же, в виде двоичного значения) может использоваться для представления отрицательных целых чисел от -2 N  - 1 до -1, потому что при сложении по модулю 2 N они ведут себя так же, как и эти отрицательные целые числа. То есть, поскольку i + j mod 2 N = i + ( j + 2 N ) mod 2 N любое значение в наборе {  j + k  2 N | k — целое число }  можно использовать вместо  j . [10]

Например, при восьми битах беззнаковые байты имеют значения от 0 до 255. Вычитание 256 из старшей половины (от 128 до 255) дает байты со знаком от -128 до -1.

Связь с дополнением до двух реализуется, если отметить, что 256 = 255 + 1 , а (255 - x ) — это дополнение до  единиц x .

Пример

В этом подразделе к десятичным числам добавляется десятичная точка "."

Например, 8-битное число может представлять только каждое целое число от -128. до 127. включительно, поскольку (2 8 − 1 = 128.) . −95. по модулю 256. эквивалентно 161. так как

−95. + 256.
= −95. + 255. + 1
= 255. − 95. + 1
= 160. + 1.
= 161.
 1111 1111 255. − 0101 1111 − 95. =========== ===== 1010 0000 (дополнение единиц) 160. + 1 + 1 =========== ===== 1010 0001 (дополнение до двух) 161.

По сути, система представляет отрицательные целые числа путем обратного счета и переноса вокруг . Граница между положительными и отрицательными числами произвольна, но по соглашению все отрицательные числа имеют самый левый бит ( самый значащий бит ), равный единице. Следовательно, самое положительное четырехбитное число — 0111 (7), а самое отрицательное — 1000 (-8). Из-за использования крайнего левого бита в качестве знакового бита абсолютное значение самого отрицательного числа (|−8.| = 8.) слишком велико для представления. Отрицать дополнение до двух очень просто: инвертируйте все биты и прибавьте единицу к результату. Например, отрицая 1111, мы получаем 0000 + 1 = 1 . Следовательно, 1111 в двоичном формате должно представлять -1 в десятичном виде. [11]

Система полезна для упрощения выполнения арифметических операций на компьютерном оборудовании. Добавление 0011 (3.) к 1111 (-1.) на первый взгляд дает неверный ответ 10010. Однако аппаратное обеспечение может просто игнорировать самый левый бит, чтобы дать правильный ответ 0010 (2.). Проверки переполнения по-прежнему должны существовать для перехвата таких операций, как суммирование 0100 и 0100.

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

Арифметические операции

Добавление

Добавление чисел, дополняющих два, не требует специальной обработки, даже если операнды имеют противоположные знаки; знак результата определяется автоматически. Например, сложив 15 и −5:

 0000 1111 (15) + 1111 1011 (−5) =========== 0000 1010 (10)

Или вычисление 5 − 15 = 5 + (−15):

 0000 0101 ( 5) + 1111 0001 (−15) =========== 1111 0110 (−10)

Этот процесс зависит от ограничения точности до 8 бит; перенос в (несуществующий) 9-й старший бит игнорируется, что приводит к арифметически правильному результату 10 10 .

Последние два бита строки переноса (чтение справа налево) содержат важную информацию: привело ли вычисление к арифметическому переполнению , число, слишком большое для представления в двоичной системе (в данном случае более 8 бит). Состояние переполнения возникает, когда эти последние два бита отличаются друг от друга. Как упоминалось выше, знак числа кодируется в старшем бите результата.

Другими словами, если два левых бита переноса (в крайнем левом углу верхней строки в этих примерах) оба равны 1 или оба 0, результат действителен; если два левых бита переноса равны «1 0» или «0 1», произошло переполнение знака. Удобно, что операция XOR над этими двумя битами может быстро определить, существует ли состояние переполнения. В качестве примера рассмотрим подписанное 4-битное сложение 7 и 3:

 0111 (носить) 0111 (7) + 0011 (3) ====== 1010 (−6) неверно!

В этом случае два крайних левых (старших) бита переноса равны «01», что означает, что произошло переполнение при сложении до двух. То есть 1010 2 = 10 10 находится за пределами допустимого диапазона от -8 до 7. Результат будет правильным, если рассматривать его как целое число без знака.

В общем, любые два N -битных числа можно складывать без переполнения, сначала расширив их знак до N  + 1 бит, а затем сложив, как указано выше. Результат N  + 1 бит достаточно велик, чтобы представить любую возможную сумму ( дополнение до двух N = 5 может представлять значения в диапазоне от -16 до 15), поэтому переполнение никогда не произойдет. Тогда при желании можно «усечь» результат обратно до N битов, сохранив при этом значение тогда и только тогда, когда отброшенный бит является правильным расширением знака оставшихся битов результата. Это обеспечивает другой метод обнаружения переполнения, который эквивалентен методу сравнения битов переноса, но который может быть проще реализовать в некоторых ситуациях, поскольку он не требует доступа к внутренним компонентам сложения.

Вычитание

Компьютеры обычно используют метод дополнений для реализации вычитания. Использование дополнений для вычитания тесно связано с использованием дополнений для представления отрицательных чисел, поскольку комбинация допускает все знаки операндов и результатов; Прямое вычитание работает и с числами с дополнением до двух. Как и в случае сложения, преимущество использования дополнения до двух заключается в исключении необходимости проверки знаков операндов для определения необходимости сложения или вычитания. Например, вычитание −5 из 15 на самом деле добавляет 5 к 15, но это скрыто представлением с дополнением до двух:

 11110 000 (взять в долг) 0000 1111 (15) − 1111 1011 (−5) =========== 0001 0100 (20)

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

Другой пример — операция вычитания, результат которой отрицательный: 15 – 35 = –20:

 11100 000 (взять в долг) 0000 1111 (15) − 0010 0011 (35) =========== 1110 1100 (−20)

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

Умножение

Для произведения двух N -битных чисел требуется 2 N бита, чтобы содержать все возможные значения. [12]

Если точность двух операндов с использованием дополнения до двух удваивается перед умножением, прямое умножение (отбрасывая любые лишние биты сверх этой точности) даст правильный результат. [13] Например, возьмем 6 × (−5) = −30 . Во-первых, точность увеличена с четырех бит до восьми. Затем числа умножаются, отбрасывая биты после восьмого бита (как показано знаком « x »):

 00000110 (6) * 11111011 (−5) ============ 110 1100 00000 110000 1100000 11000000 х10000000 + хх00000000 ============ хх11100010

Это очень неэффективно; за счет удвоения точности заранее все сложения должны иметь двойную точность, и требуется как минимум вдвое больше частичных продуктов, чем для более эффективных алгоритмов, фактически реализованных в компьютерах. Некоторые алгоритмы умножения предназначены для дополнения до двух, особенно алгоритм умножения Бута . Методы умножения чисел знака и величины не работают с числами с дополнением до двух без адаптации. Обычно не возникает проблем, когда множимое (то, которое многократно прибавляется для образования произведения) отрицательно; проблема заключается в правильной установке начальных битов произведения, когда множитель отрицательный. Распространены два метода адаптации алгоритмов для обработки чисел с двумя дополнениями:

В качестве примера второго метода возьмем обычный алгоритм сложения и сдвига для умножения. Вместо смещения частичных продуктов влево, как это делается с карандашом и бумагой, накопленный продукт сдвигается вправо, во второй регистр, который в конечном итоге будет содержать наименее значимую половину продукта. Поскольку младшие биты не изменяются после их вычисления, сложения могут иметь одинарную точность и накапливаться в регистре, который в конечном итоге будет содержать наиболее значимую половину произведения. В следующем примере, снова умножая 6 на −5, два регистра и бит расширенного знака разделяются знаком «|»:

 0 0110 (6) (множимое с расширенным знаковым битом) × 1011 (−5) (множитель) =|====|==== 0|0110|0000 (первое частичное произведение (самый правый бит равен 1)) 0|0011|0000 (сдвиг вправо, сохраняя бит расширенного знака) 0|1001|0000 (добавить второе частичное произведение (следующий бит равен 1)) 0|0100|1000 (сдвиг вправо, сохраняя бит расширенного знака) 0|0100|1000 (добавьте третье частичное произведение: 0, чтобы никаких изменений) 0|0010|0100 (сдвиг вправо, сохраняя бит расширенного знака) 1|1100|0100 (вычесть последнее частичное произведение, поскольку оно из знакового бита) 1|1110|0010 (сдвиг вправо, сохраняя бит расширенного знака) |1110|0010 (отбросить бит расширенного знака, давая окончательный ответ -30)

Сравнение (упорядочение)

Сравнение часто реализуется с помощью фиктивного вычитания, при котором проверяются флаги в регистре состояния компьютера , но основной результат игнорируется. Нулевой флаг указывает, равны ли два сравниваемых значения. Если исключающее ИЛИ флагов знака и переполнения равно 1, результат вычитания меньше нуля, в противном случае результат равен нулю или больше. Эти проверки часто реализуются в компьютерах в инструкциях условного перехода .

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

Следующий алгоритм (для n -битной архитектуры с дополнением до двух) устанавливает регистр результата R в -1, если A < B, в +1, если A > B, и в 0, если A и B равны:

// обратное сравнение знакового битаесли A ( n - 1 ) == 0 и B ( n - 1 ) == 1 , то вернуть + 1 иначе, если A ( n - 1 ) == 1 и B ( n - 1 ) == 0 , то вернуть - 1 конец // сравнение оставшихся битов                      для i = n - 2 ... 0 сделать, если A ( i ) == 0 и B ( i ) == 1 , то вернуть - 1 иначе , если A ( i ) == 1 и B ( i ) == 0 , то вернуть + 1 конец конец возврат 0                               

Дополнение до двух и 2-адические числа

В классической работе HAKMEM , опубликованной Лабораторией искусственного интеллекта Массачусетского технологического института в 1972 году, Билл Госпер отметил, что является ли внутреннее представление машины дополнением до двух, можно определить путем суммирования последовательных степеней двойки. В полете фантазии он заметил, что результат выполнения этого алгебраического действия указывает на то, что «алгебра выполняется на машине (вселенной), которая является дополнением до двух». [15]

Конечный вывод Госпера не обязательно следует воспринимать всерьез, он сродни математической шутке . Критическим шагом является «...110 = ...111 - 1», т.е. «2 X = X  - 1», и, следовательно, X  = ...111 = -1. Это предполагает метод, с помощью которого бесконечная строка единиц считается числом, что требует расширения понятий конечного разряда в элементарной арифметике. Оно имеет смысл либо как часть обозначения с дополнением до двух для всех целых чисел, либо как типичное 2-адическое число , либо даже как одна из обобщенных сумм, определенных для расходящегося ряда действительных чисел 1 + 2 + 4 + 8 + ·· · . [16] Цифровые арифметические схемы, идеализированные для работы с бесконечными (расширяющимися до положительных степеней 2) битовыми строками, производят 2-адическое сложение и умножение, совместимые с представлением дополнения до двух. [17] Непрерывность двоичных арифметических и побитовых операций в 2-адической метрике также находит некоторое применение в криптографии. [18]

Преобразование дробей

Чтобы преобразовать число с дробной частью, например 0,0101, необходимо преобразовать, начиная справа налево, единицы в десятичные, как при обычном преобразовании. В этом примере 0101 равно 5 в десятичном формате. Каждая цифра после плавающей точки представляет собой дробь, знаменатель которой равен множителю 2. Итак, первая цифра — 1/2, вторая — 1/4 и так далее. Поскольку десятичное значение уже вычислено, как указано выше, используется только знаменатель младшего значащего разряда (LSB = начиная справа). Конечный результат этого преобразования — 5/16.

Например, при наличии плавающего значения 0,0110 для работы этого метода не следует учитывать последний 0 справа. Следовательно, вместо вычисления десятичного значения для 0110, мы вычисляем значение 011, которое равно 3 в десятичном виде (если оставить 0 в конце, результат будет 6 вместе со знаменателем 2 4  = 16, что сводится к 3/8). Знаменатель равен 8, что дает окончательный результат 3/8.

Смотрите также

Примечания

  1. ^ Для x = 0 мы имеем 2 N − 0 = 2 N , что эквивалентно 0* = 0 по модулю 2 N (т. е. после ограничения N младших битов).

Рекомендации

  1. ^ Например, «Целые числа со знаком — это двоичные значения с дополнением до двух, которые можно использовать для представления как положительных, так и отрицательных целых значений». Раздел 4.2.1 в Руководстве разработчика программного обеспечения для архитектур Intel 64 и IA-32, Том 1: Базовая архитектура, ноябрь 2006 г.
  2. ^ Бергель, Александр; Кассу, Дэмиен; Дюкасс, Стефан; Лаваль, Янник (2013). Глубоко в Фаро (PDF) . п. 337.
  3. ^ Дэвид Дж. Лилья; Сачин С. Сапатнекар (2005). Проектирование цифровых компьютерных систем с помощью Verilog. Издательство Кембриджского университета.
  4. ^ фон Нейман, Джон (1945), Первый проект отчета о EDVAC (PDF) , получено 20 февраля 2021 г.
  5. ^ «Математика». Спецификация API. Платформа Java SE 7.
  6. ^ Регер, Джон (2013). «Никто не ожидает, что испанская инквизиция или INT_MIN будет разделена на -1». Regehr.org (блог).
  7. ^ ab Seacord, Роберт К. (2020). «Убедитесь, что операции с целыми числами со знаком не приводят к переполнению». Правило INT32-C. wiki.sei.cmu.edu . Стандарт кодирования SEI CERT C.
  8. ^ Аффельдт, Рейнальд и Марти, Николас (2006). Формальная проверка арифметических функций в ассемблере SmartMIPS (PDF) (Отчет). Архивировано из оригинала (PDF) 22 июля 2011 г.
  9. ^ Харрис, Дэвид Мани; Харрис, Сара Л. (2007). Цифровой дизайн и компьютерная архитектура. п. 18 – через Google Книги.
  10. ^ "3.9. Дополнение двух" . Глава 3. Представление данных . cs.uwm.edu. 03.12.2012. Архивировано из оригинала 31 октября 2013 года . Проверено 22 июня 2014 г.
  11. ^ Финли, Томас (апрель 2000 г.). «Дополнение двоих». Информатика. Конспекты занятий по CS 104. Итака, Нью-Йорк: Корнельский университет . Проверено 22 июня 2014 г.
  12. ^ Бруно Пайяр. Введение в процессоры цифровых сигналов , разд. 6.4.2. Отчет Génie électrique et informationtique, Университет Шербрука, апрель 2004 г.
  13. Карен Миллер (24 августа 2007 г.). «Дополнительное умножение до двух». cs.wisc.edu . Архивировано из оригинала 13 февраля 2015 года . Проверено 13 апреля 2015 г.
  14. ^ Уэйкерли, Джон Ф. (2000). Принципы и практика цифрового дизайна (3-е изд.). Прентис Холл. п. 47. ИСБН 0-13-769191-2.
  15. ^ «Хаки программирования». ХАКМЕМ . ПУНКТ 154 (Госпер).
  16. ^ О суммировании 1 + 2 + 4 + 8 + ··· без обращения к 2-адической метрике см. Hardy, GH (1949). Дивергентный сериал . Кларендон Пресс. ЖКК  QA295 .H29 1967 г.(стр. 7–10)
  17. ^ Виймен, Жан (1993). О схемах и цифрах (PDF) . Париж: Digital Equipment Corp., с. 19 . Проверено 29 марта 2023 г., Глава 7, особенно 7.3 по умножению.
  18. ^ Анашин, Владимир; Богданов Андрей; Кижватов, Илья (2007). «Потоковый шифр ABC». Российский государственный гуманитарный университет . Проверено 24 января 2012 г.

дальнейшее чтение

Внешние ссылки