Способы представления отрицательных двоичных чисел

Отрицательные двоичные числа

Самый простой метод представления отрицательных чисел – отвести один бит (логичнее всего – старший) для хранения знака. По причинам, которые вы поймете далее, значение 1 в этом бите означает знак «минус», а 0 – знак «плюс». Что произойдет с нашим числом при таком представлении?

В области положительных чисел не произойдет ничего, кроме того, что их диапазон сократится вдвое, – например, для числа в байтовом представлении вместо диапазона 0…255 мы получим всего лишь 0…127 (0000 0000–0111 1111). А отрицательные числа будут иметь тот же диапазон, только старший бит у них будет равен 1. Все просто, не правда ли?

Нет, неправда. Такое представление отрицательных чисел совершенно не соответствует обычной числовой оси, на которой влево от нуля идет минус единица, а затем числа по абсолютной величине увеличиваются. Здесь же мы получаем, во‑первых, два разных нуля («обычный» 0000 0000 и «отрицательный» 1000 0000), во‑вторых, оси отрицательных и положительных чисел никак не стыкуются, и производство арифметических операций превратится в головоломку. Поэтому поступим так: договоримся, что ‑1 соответствует число 255 (1111 1111), – 2 – число 254 (1111 1110) и т. д. вниз до 128 (1000 0000), которое будет соответствовать ‑128 (и общий диапазон всех чисел получится от ‑128 до 127). Очевидно, что если вы при таком представлении хотите получить отрицательное число в обычном виде, то надо из значения числа (например, 240) вычесть максимальное значение диапазона (255) плюс 1 (256). Если отбросить знак, то результат такого вычитания (16 в данном случае) называется еще дополнением до 2 для исходного числа (а само исходное число 240 – дополнением до 2 для 16). Название «дополнение до 2» используется независимо от разрядности числа, потому что верхней границей всегда служит степень двойки (в десятичной системе аналогичная операция называется «дополнение до 10»).

Что произойдет в такой системе, если вычесть, например, 2 из 1? Запишем это действие в двоичной системе обычным столбиком:

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

На самом деле девятиразрядное число 1 0000 0000 есть не что иное, как 256, т. е. то же самое максимальное значение плюс 1, и мы здесь выполнили две операции: прибавили к уменьшаемому эти самые 256, а затем выполнили вычитание, но уже в положительной области для всех участвующих чисел.

А что результат? Он будет равен 255, т. е. тому самому числу, которое, как мы договорились, и представляет – 1. Получается, что вычитание в такой системе происходит автоматически правильно, независимо от знака участвующих чисел. Если хотите, можете потренироваться и проверить, скажем, что будет, если в этой системе вычесть 240 из 100.

Немного смущает только эта самая операция нахождения дополнения до 2, точнее, в данном случае, до 256 – как ее осуществить на практике, если схема всего имеет 8 разрядов? В дальнейшем мы увидим, что иногда ее осуществлять вовсе не надо – некоторые электронные схемы ведут себя так, что при осуществлении вычитания вся процедура осуществляется автоматически. Особенно наглядно это выглядит для двоичных реверсивных счетчиков, которые мы будем рассматривать в главе 16 .

В точности так же ведут себя и соответствующие команды в микропроцессорах – и если вы захотите произвести операцию вычитания числа 2 из содержимого восьмибитового регистра, содержащего число 1, то в регистре окажется число 255 (все единицы). А интерпретация результата – как отрицательного числа или как положительного – это уже ваши трудности.

В микропроцессорах есть обычно и команда, которая возвращает дополнение до 2, в большинстве ассемблеров она называется NEG, от слова «негативный», потому что меняет знак, если мы договариваемся считать числа «со знаком». А как ее можно было бы осуществить «вручную», не обращаясь в действительности к 9‑му разряду? Вернемся к рассмотренным ранее примерам и выпишем столбиком исходные числа, результаты операции нахождения дополнения до 2 и результат еще одной манипуляции, которая представляет собой вычитание единицы из дополнения до 2, т. е., что то же самое, просто вычитания исходного числа из наивысшего числа диапазона (255):

Читайте также:  Бухгалтерские счета являются способом

Если мы сравним двоичные представления в верхней и нижней строках, то увидим, что они могут быть получены друг из друга путем инверсии каждого из битов. Эта операция называется нахождением дополнения до 1 (потому что число, из которого вычитается, содержит все 1 во всех разрядах; для десятичной системы аналогичная операция называется дополнение до 9 ). Для нахождения дополнения до 1 девятый разряд не требуется, да и схему можно построить так, чтобы никаких вычитаний не производить, а просто переворачивать биты. То есть, для полного сведения вычитания к сложению надо проделать три операции:

1. Найти дополнение до 1 для вычитаемого (инвертировать его биты).

2. Прибавить к результату 1, чтобы найти дополнение до 2.

3. Сложить уменьшаемое и дополнение до 2 для вычитаемого.

Заметим, что все сложности с этими многочисленными дополнениями связаны с наличием нуля в ряду натуральных чисел – если бы его не было, дополнение было бы всего одно, и операция вычитания упростилась. Так может, греки все же были в чем‑то правы?

В заключение обратим внимание на еще одно замечательное свойство двоичных чисел, которое часто позволяет значительно облегчить операции умножения и деления, а именно: умножению на 2 соответствует операция сдвига всех разрядов числа на один разряд влево, а операции деления на 2 – вправо. Крайние разряды (старший при умножении и младший при делении) в общем случае при этом должны теряться, но в микропроцессорах есть специальный бит переноса, в который эти «потерянные» разряды помещаются. Противоположные крайние разряды (младший при умножении и старший при делении) в общем случае замещаются нулями, но могут и замещаться значением бита переноса, что позволяет без лишних проблем делить и умножать числа с разрядностью больше одного байта. Как можно догадаться, умножению и делению на более высокие степени двойки будет соответствовать операция сдвига в нужную сторону на иное (равное степени) число разрядов.

Излишне говорить, что операцию сдвига разрядов в электронных схемах производить неизмеримо проще, чем операции деления и умножения. Есть и специальные схемы для этой операции – сдвиговые регистры, которые мы также будем «проходить» (в главе 16 ).

Дробные числа

Сразу заметим, что в некомпьютерной электронике дробными числами стараются не пользоваться. При необходимости их переводят в целые, умножая на соответствующую степень десяти (а чаще – даже на степень 2, что проще), при этом все остальные участвующие в расчетах величины также масштабируются в нужное число раз. Затем при выводе, к примеру, на цифровой дисплей, запятая просто устанавливается в нужном месте (иногда заранее, и без возможности изменения ее положения). То есть, для цифровой схемы не существует значения температуры, равного 30,81 градуса, а есть число 3081 в BCD‑формате. Примерно те же действия мы производили, когда конструировали цифровой термометр в главе 13 , – на самом деле он показывает целое число милливольт в нужном масштабе.

И все же – как мы можем при необходимости представить дробные числа, если двоичные разряды ничего о таковых «не знают» и могут воспроизводить только целые числа в соответствии с формулой (4)? Мы не будем рассматривать расширение этой формулы, включающее в себя представление в позиционной системе не только целых, но и всех действительных чисел «с плавающей запятой», т. к. в электронике такой вариант не хождения не имеет. В электронике и компьютерной технике используют другой способ представления действительных чисел – с помощью мантиссы и порядка, в так называемом нормализованном виде . При этом место запятой фиксируется:

0,0125 = 0,125·10 ‑1 ,

1254,81 =0,125481·10 4 .

Читайте также:  Способы самозащиты для девушек

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

Легко заметить, что и саму запятую, и основание степени тут можно опустить, записывая в память лишь мантиссу и порядок – конечно, если всегда помнить, что мы имеем в виду. Например, можно сделать так: отвести в памяти три байта, из которых первые два хранят цифры мантиссы, а третий отведен под порядок. Легко также подсчитать, каков будет диапазон чисел, могущих быть представленными таким образом, – число, которое представляет мантиссу, будет укладываться в диапазон от ‑32768 до 32767, т. е. иметь от 4 до 5 значащих десятичных цифр. На практике операции с дробными числами можно производить несколько проще, и мы будем их осваивать в главе 20 .

Источник

Представление положительных и отрицательных чисел в памяти компьютера. Прямой и дополнительный код числа

Прямой код

Прямой код – это представление числа в двоичной системе счисления, при котором первый (старший) разряд отводится под знак числа. Если число положительное, то в левый разряд записывается 0; если число отрицательное, то в левый разряд записывается 1.

Таким образом, в двоичной системе счисления, используя прямой код, в восьмиразрядной ячейке (байте) можно записать семиразрядное число. Например:

0 0001101 – положительное число
1 0001101 – отрицательное число

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

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

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

Дополнительный код

В дополнительном коде, также как и прямом, первый разряд отводится для представления знака числа. Прямой код используется для представления положительных чисел, а дополнительный – для представления отрицательных. Поэтому, если в первом разряде находится 1, то мы имеем дело с дополнительным кодом и с отрицательным числом.

Все остальные разряды числа в дополнительном коде сначала инвертируются, т.е. заменяются противоположными (0 на 1, а 1 на 0). Например, если 1 0001100 – это прямой код числа, то при формировании его дополнительного кода, сначала надо заменить нули на единицы, а единицы на нули, кроме первого разряда. Получаем 1 1110011. Но это еще не окончательный вид дополнительного кода числа.

Далее следует прибавить единицу к получившемуся инверсией числу:

1 1110011 + 1 = 1 1110100

В итоге и получается число, которое принято называть дополнительным кодом числа.

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

Источник

Отрицательные числа в двоичной системе

задал вопрос математика, но почему-то молчат.

может Вы разжуете ребята?

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

пожалуйста , если вдруг решите объяснить, то сделайте это как можно проще
желательно на примере

Некоторое устройство позволяет хранить пятиразрядные числа в двоичной системе счисления
Некоторое устройство позволяет хранить пятиразрядные числа в двоичной системе счисления.

Как определить, сколько разрядов в двоичной системе требуется для записи десятичного числа n?
Как определить, сколько разрядов в двоичной системе требуется для записи десятичного числа n?

Читайте также:  Формулы ускорения при координатном способе задания движения

Объясните,как в двоичной системе получаются отрицательные числа,т.е в компьютере?
Объясните,как в двоичной системе получаются отрицательные числа,т.е в компьютере? Добавлено.

01111111-это 127. тип signet
инвертируем: 00000000, и меняем в первом бите ноль на единицу .получаем 1000000 а это минус 127.
зачем добавлять единицу, я не пойму. но преподаватель говорить, что такой алгоритм
как это происходит?

Добавлено через 7 минут
опять ошибка. инвертируем 10000000

pcmax, лучше рассмотрим на примере числа 6 = 00000110b
Для начала вспомним, что сумма равных по модулю чисел, но с разным знаком равна нулю, т.е. 6 + (-6) = 0
Далее, проинвертируем 00000110b, получим 11111001b
Если сложим, то 0 не получим! Проверь.
Чтобы был 0, надо, чтобы в первом числе к первому справа ненулевому разряду добавлялась 1
Это мы и достигаем, когда к инвертированному добавим 1.
Получим: 11111001b + 1 = 111111010b
В результате, первый справа ненулевой бит первого числа будет во втором числе также ненулевым,
все правее его — нулевые, а попарная сумма всех остальных бит первого и второго даст 1
И если сложить, получим 0!

Такое представление чисел называется дополнительным кодом.
И применяется, чтобы операция вычитания ничем не отличалась от сложения.

Источник

Представление отрицательных чисел в двоичной системе счисления

Положительные числа нами были рассмотрены ранее. Рассмотрим способы представления отрицательных чисел в двоичном коде. Существует несколько способов такого представления. Мы рассмотрим три:

1. прямой код (в этом случае в двоичном числе выделяется бит-знака — старший бит). Рассмотрим однобайтное (8 бит) двоичное число со знаком.

Старший бит младший бит

Рисунок 2.5 — Представление однобайтных чисел со знаком

Если бит-знак равен 0, то число считается положительным, а если бит-знак равен 1 = отрицательным.

Недостатком прямого кода является невозможность выполнения арифметических операций.

Рассмотрим сложение: 12+(-12)=0

Как видим в результате сложения получились число -24, что не равно 0.

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

Числа здесь представляются так:

Число в смещенном коде Двоичный код Число без знака
………. ……… ..…….
-1
………. ………. ………
-127
-128

Достоинством данной системы является то, что в ней выполняются арифметические операции, правда с учетом коррекции результата. А недостатком является то, что 0 соответствует числу 128.

Рассмотрим сложение: 12+(-12)=0

Как видим, в результате операции получилось число 256. Ограничив предел рассмотрения одним байтом, получим 00000000, к этому результату надо прибавить смещение 128.

Рассмотрим сложение: 12+(-13)=0

Как видим, и в данном случае к результату необходимо прибавить 128 и ограничить рассмотрение одним байтом.

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

Рассмотрим порядок перевода числа -9 из десятичной системы в дополнительный код:

1. запишем число без знака: 9;

2. преобразуем число в двоичный код: 00001001;

3. получим обратный код: 11110110;

4. прибавим 00000001 и получим: 11110111.

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

1. запишем дополнительный код: 11110111;

2. получим обратный код: 00001000;

3. прибавим 00000001: 00001001;

4. преобразуем число в десятичный код: -9

Знак минус мы добавили, так как знаем, что наше исходное число в дополнительном коде отрицательное (старший бит равен 1)

Рассмотрим таблицу соответствия чисел представленных в дополнительном коде.

Число со знаком Двоичный код Число без знака
+127
………………………. ………………………… …………………………
+2
+1
+0
-1
-2
-3
………………………. ………………………… …………………………
-128

В дополнительном коде сохраняются все правила выполнения арифметических операций.

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Источник

Оцените статью
Разные способы