Как найти дополнительный код от восьмеричного числа?
Rikoniko
Ученик
(198),
на голосовании
5 лет назад
Голосование за лучший ответ
Президент интернета
Просветленный
(42389)
5 лет назад
Дополнительный код (англ. two’s complement, иногда twos-complement) — наиболее распространённый способ представления отрицательных целых чисел в компьютерах.
Krab Bark
Искусственный Интеллект
(263500)
5 лет назад
Каждая цифра заменяется на 7−цифра и к получившемуся числу добавляется 1.
Похожие вопросы
Пользователь Евгений попросил нас сделать перевод из прямого в дополнительный или обратный коды .
Далее идет калькулятор, который переводит введенное положительное или отрицательное целое число в двоичный код, а также выводит обратный код этого числа и его дополнительный код. Под калькулятором, как водится, немного теории.
Шаг определяет экспоненту числа с плавающей запятой как двоичное число. Используется следующая формула. Здесь был выбран показатель 2-1, потому что результат между 1 и 2. Теперь десятичное число 0, 6 преобразуется в двойное. Таким образом, определяется приблизительное значение. Если используется сила, напишите 1 в мантиссе, для неиспользуемых полномочий используется 0.
Для преобразования десятичного разряда 0. 6 это будет выглядеть так. Это приводит к следующему появлению мест в мантиссе. Наконец, вы устанавливаете бит знака, и получаете следующий результат. Число положительное, показатель и мантисса определены. Автор был бы рад поддержке. Результирующие значения приведены в разных размерах бит, при этом значение усекается в двоичном виде на соответствующее количество бит.
Обновление
: Из комментариев становится ясно, что люди не вполне понимают, что делает этот калькулятор. Точнее, что делал – применял алгоритм вычисления дополнительного кода к любому числу. Люди хотят, чтобы он им просто показывал дополнительный код числа. Ну хорошо – теперь при вводе положительного числа калькулятор показывает представление числа в двоичной форме, ибо для него нет обратного и дополнительного кода, а при вводе отрицательного показывает дополнительный и обратный код.
Можно ввести следующие символы. Все остальные символы просто пропущены. Это позволяет без каких-либо проблем вводить форматированные значения. Во время вывода значения предоставляются автоматически генерируемыми разделителями для облегчения отображения в браузере и повышения удобочитаемости.
В десятичном представлении отрицательные числа дополнения к двум даны со знаком. Внимание: результат дополнения необязательно должен быть отрицательным вариантом введенного значения, потому что отсечение лишних битов может привести к тому, что значения будут полностью разными. Десятичное значение дополнения дополнения отключено по умолчанию, потому что его дополнение на сегодняшних компьютерах имеет смысл только в двоичном, шестнадцатеричном или восьмеричном. Однако для тех, кого это интересует, следует отметить, что код, необходимый для представления, только прокомментирован.
Итак, теория
Прямой код
числа это представление беззнакового двоичного числа. Если речь идет о машинной арифметике, то как правило на представление числа отводится определенное ограниченное число разрядов. Диапазон чисел, который можно представить числом разрядов n равен
Обратный код
числа, или дополнение до единицы
(one’s complement
) это инвертирование прямого кода (поэтому его еще называют инверсный код
). То есть все нули заменяются на единицы, а единицы на нули.
Программа работает на основе полного массива. Все входные значения сначала преобразуются в их двоичное представление и биты, хранящиеся в массиве. Поскольку массив может иметь любой размер, вы также можете вводить значения любого размера. Для каждого представления этот массив поразрядным образом преобразуется и генерируется соответствующая строка вывода.
Самая большая проблема с поразрядным преобразованием – десятичные числа: направление десятичных двоичных чисел по-прежнему относительно просто с помощью некоторых простых дополнений, но двоично-десятичное значение направления должно быть смоделировано с помощью алгоритма вычитания.
Дополнительный код
числа, или дополнение до двойки
(two’s complement
) это обратный код, к младшему значащему разряду которого прибавлена единица
А теперь «зачем, зачем это все?» ©
А это все для удобной работы со знаками. Поскольку я все люблю понимать на примерах, рассказывать я тоже буду на примерах. Итак, предположим, что у нас 4 разряда для работы с двоичными числами. Представить таким образом можно 16 чисел – 0, 1, … 15
00 – 0000
…
15 – 1111
Поскольку программа работает с массивами, она не соответствует мировому уровню, но достаточно быстро. Очень приятно рассмотреть это, как на самом деле компьютер представляет отрицательные числа. Это с нулями и теми, которые уже слышали. Но как насчет минусовых чисел? Решение называется одним и двумя дополнениями.
Действительно интересный вопрос, поскольку в двоичных числах нет знаков. Существует только возможность 0 и 1. Самый значительный бит, наименее значимый бит, дополнение, дополнение двух. Метод «Самый значительный бит», вероятно, один из самых простых и понятных. Он просто смотрит на последний бит. Если это 0, это положительное число, оно имеет значение 1, поэтому оно является отрицательным числом.
Но если нет знака, убогая получается арифметика. Нужно вводить знак. Чтобы никого не обидеть, половину диапазона отдадим положительным числам (8 чисел), половину – отрицательным (тоже 8 чисел). Ноль, что отличает машинную арифметику от обычной, мы отнесем в положительные числа (в обычной арифметике у нуля нет знака, если не ошибаюсь). Итого, в положительные числа попадают 0,…,7, а в отрицательные -1, …, -8.
Однако уже существует проблема с нулевым значением: есть два нулевых значения. Это может звучать банально, но это огромная проблема в цифровой обработке, что делает ее менее практичной. Подобно методу «Наименьший значащий бит», здесь только один бит заполняется 0 и 1 для представления отрицательного значения. Напротив, однако, для этого отмечен первый бит, то есть самый правый.
Опять же, существует проблема, что значение нуля может принимать два значения. Кроме того, он выглядит просто глупым и раздражает только если вы установили первый бит с флагом. Его дополнение немного сложнее. Это говорит о том, что все положительные числа остаются такими, какими они есть, и все негативы перевернуты. Перевернутое просто означает, что каждый 0 становится равным 1, и каждый 1 становится единым. Таким образом, отрицательное значение просто вращает целое число.
Для различия положительных и отрицательных чисел выделяют старший разряд числа, который называется знаковым
(sign bit
)
0 в этом разряде говорит нам о том, что это положительное число, а 1 – отрицательное.
С положительными числами все вроде бы понятно, для их представления можно использовать прямой код
0 – 0000
1 – 0001
7 - 0111
В конце концов, снова на самом высоком, самом левом, бит. Таким образом, нет смысла занимать наивысший бит и, следовательно, косвенно относится к различию. Опять же, снова возникает проблема двух значений для нуля. Почему вам все еще нужно дополнение?
Два дополнения – пока что показаны – единственный метод с единственным нулевым значением. Процедура такая же, как и в дополнении, за исключением того, что к инвертированному числу добавляется еще один. Чтобы распознать дополнение двух, последний бит косвенно отвечает снова. Если бы это повлияло на 1, это всегда означало бы переполнение, которое в свою очередь представляло бы 0. Если вы сформируете дополнение к нулю, вы всегда создаете переполнение, но последняя цифра не учитывается – именно из-за переполнения.
А как представить отрицательные числа?
Вот для их представления как раз и используется дополнительный код.
То есть, -7 в дополнительном коде получается так
прямой код 7 = 0111
обратный код 7 = 1000
дополнительный код 7 = 1001
Обратим внимание на то, что прямой код 1001 представляет число 9, которое отстоит от числа -7 ровно на 16, или .
Или, что тоже самое, дополнительный код числа “дополняет” прямой код до , т.е. 7+9=16
Диапазоны значений Примечание
Таким образом, вы снова получаете значение 0, поэтому может быть представлено только одно значение! В случае метода с двойным нулевым значением диапазон значений составляет от 127 до 0 и от 0 до. Диапазон изображения может быть пронумерован на 255, но значение теряется из-за отрицательного значения минус-нуля.
В двух долях имеется ровно 256 значений, так как оно содержит только одно нулевое значение. Переменные содержат значение, представленное цифровым или буквенно-цифровым кодом. Система нумерации, которую люди используют, представляет собой десятичную систему, это означает, что существует 10 различных символов, которые объединяются для построения любого числа. Эти 10 символов – это число от 0 до Например, чтобы представить число 121 в десятичном виде, выполняется следующая операция.
И это оказалось очень удобно для машинных вычислений – при таком представлении отрицательного числа операции сложения и вычитания можно реализовать одной схемой сложения, при этом очень легко определять переполнение результата (когда для представления получившегося числа не хватает разрядности)
Пара примеров
7-3=4
0111 прямой код 7
1101 дополнительный код 3
0100 результат сложения 4
В этом примере видно, что для того, чтобы получить номер, символ каждой позиции взят, он умножается на основание, поднятое до положения, в котором символ найден, начиная с номера 0, другими словами символ в позиции нуль умножается на 1, символ во втором положении умножается на 10, символ третьей позиции умножается на 100 и т.д.
Система двоичной нумерации работает аналогично десятичной системе нумерации с той разницей, что в двоичной системе число символов равно двум, 0 и, например, для представления числа 121 в двоичном порядке выполняется следующая операция. На этом этапе вы можете спросить, как была получена структура единиц и нулей для представления 121 в двоичном формате, существует несколько способов сделать это, очень простой – постепенно размещать 1 слева направо, если поместить 1 в определенная позиция, и значение превышает искомое значение, тогда эта позиция несет ноль.
1+7=6
1111 дополнительный код 1
0111 прямой код 7
0110 результат сложения 6
Что касается переполнения – оно определяется по двум последним переносам, включая перенос за старший разряд. При этом если переносы 11 или 00, то переполнения не было, а если 01 или 10, то было. При этом, если переполнения не было, то выход за разряды можно игнорировать.
Для предыдущего примера, если мы начинаем с 1 в позиции 7, полученное значение составляет 127, что больше 121, по этой причине мы начинаем с 1 в позиции. Следующая таблица суммирует процедуру. Каждая позиция двоичного числа также называется битом, в случае предыдущего примера число 121 представлено 7 битами.
Эти двоичные переменные могут быть разных типов, наиболее часто используются: логические или битовые, целые числа, с плавающей запятой и символы или строки символов. Целочисленные и переменные с плавающей запятой называются аналоговыми переменными. Булевы переменные, также называемые логическими или битовыми, представляют собой двоичные представления одного бита или с одной цифрой, в этом смысле они могут иметь только значения 0 или 1, которые обычно интерпретируются как ложные или истинные соответственно.
Примеры где показаны переносы и пятый разряд
00111 прямой код 7
00001 прямой код 1
01110 переносы
01000 результат 8 – переполнение
Два последних переноса 01 – переполнение
7+7=0
00111 прямой код 7
01001 дополнительный код 7
11110 переносы
10000 результат 16 – но пятый разряд можно игнорировать, реальный результат 0
Два последних переноса 11 з перенос в пятый разряд можно отбросить, оставшийся результат, ноль, арифметически корректен.
Опять же проверять на переполнение можно простейшей операцией XOR двух бит переносов.
Количество бит, как упоминалось ранее, определяет диапазон значений, которые может иметь переменная. При представлении двоичных чисел иногда позитивные числа представлены и нулевые, этот код называется чистым двоичным; но вы также можете представлять отрицательные, положительные и нулевые значения, этот код называется двоичным в дополнении. В зависимости от номера бита имя может быть назначено целому числу, например, 8-битовое целое также называется байтом.
Следующая таблица показывает сводку номера бита и его диапазона. Переменные плавающей точки, также называемые вещественными, могут содержать число с десятичными знаками.
- Двоичная система Алгоритмы изменения базы.
- Ритм на чужой основе.
- Представление чисел на компьютере.
Двоичная система, также называемая базой 2, представляет собой систему нумерации, в которой цифры представлены с использованием только двух цифр: нуля и единицы. Это одна из систем, которые используются в компьютерах, потому что они работают внутри с двумя уровнями напряжения, поэтому их естественная система нумерации является двоичной системой.
Вот благодаря таким удобным свойствам дополнительный код это самый распространенный способ представления отрицательных чисел в машинной арифметике.
P.S. Ну а обратный код дополняет число до , или до всех 1, потому и называется дополнением до 1. Им тоже можно представлять отрицательные числа, и реализовать вычитание и сложение схемой сложения, только сложение там хитрее – с циклическим переносом, ну и представить можно меньше на одно число, так как все единицы уже заняты – это обратный код нуля, эдакий «минус нуль», то есть диапазон получается, если брать наш пример от -7 до 7. Не так удобно, одним словом.
Лейбниц использовал 0 и 1, как и текущую двоичную систему нумерации. Двоичная система представляет собой систему нумерации, в которой используется позиционная нотация, это означает, что каждая цифра имеет значение, которое зависит от ее относительного положения, это значение определяется базой, которая представляет собой число цифр, необходимых для напишите любое число. Теперь ничего лучше, чем пример, чтобы лучше понять выше.
Число «пятьсот сорок две и одна десятая» состоит из пятисот, четырех десятков, двух единиц и одной десятой. Каждая цифра этого числа имеет значение, которое зависит от его положения относительно десятичной точки, как видно из предыдущего изображения. В левой части десятичной точки экспонента базы принимает значения от нуля вперед, так как первое место занимает место единиц, но в правой части десятичной точки экспонента принимает значения из по крайней мере, один вперед убывает, так как позиции справа от десятичной точки занимают места, которые представляют дробные значения.
Ответ вот на такой загадочный вопрос:
Представление отрицательных целых чисел – дополнительный код.
я понял что если в первом разряде стоит 0 то число положительное
а если 1 то отрицательное… а как посчитать?
Не понял, что конкретно ты хотел сделать?
Узнать, как двоичное представление отрицательного числа расписать, что ли?
Предыдущее число, показанное в качестве примера, равно 4 десятичным разрядам, оно также называется 4 десятичным знаками, так как в его представлении используются 4 цифры десятичной системы. На английском языке двоичная цифра записывается как «бинарная цифра», то есть бит.
Алгоритмы изменения базы. Приведенное выше объяснение является основой любой системы позиционной нумерации, то есть является той же логикой. На самом деле существуют бесконечные системы позиционной нумерации, наиболее известные на компьютерах: двоичные, восьмеричные, десятичные и шестнадцатеричные. Системы нумерации, база которых меньше 10, используют цифры десятичной системы, которые необходимы. Когда основание больше десяти, используются необходимые буквы алфавита. В дополнение к вышесказанному все числа, записанные в базе, отличной от десятичной, имеют в качестве индекса число, заключенное в круглые скобки.
Например, так.
Имеем десятичное число -2013, надо его записать в двоичном коде.
Переводим положительное число 2013 в двоичную систему, получаем
11111011101.
Дописываем слева нули, чтоб вышло 16 разрядов (если число двухбайтовое), имеем
0000011111011101 (прямой код).
Инвертируем все биты (то есть, 0 заменяем на 1, а 1 на 0), имеем
1111100000100010 (обратный код).
Прибавляем в двоичной системе 1 к обратному коду, имеем
1111100000100011. Это значение равно -2013.
Проверить можно стандартным калькулятором Windows:
запускаешь кальулятор (Программы – Стандартные – Калькулятор), в XP выбираешь в меню программы Вид – Инженерный, в “семерке”, по-моему, Вид – Программист, набираешь выражение, ответом для которого будет нужное отрицательное число, например,
0-2013 = -2013,
переключаешь систему счисления на двоичную (Bin), а ёмкость числа – на 2 байта,
видишь 1111100000100011.
Или у нас сразу есть отрицательное двоичное
число, скажем, 1111111111101111 (самый левый бит – единица, значит, отрицательное)… левая “1” обозначает знак “-“, отбрасываем её, а от оставшегося двоичного числа отнимаем 1, получаем
111111111101110, заменяем все нули на 1, а единицы на нули, получаем
000000000010001, а это есть десятичное 17. Значит, код обозначал -17.
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 31 января 2021 года; проверки требуют 29 правок.
Дополнительный код (англ. “two’s complement”, иногда “twos-complement”) — наиболее распространённый способ представления отрицательных целых чисел в компьютерах. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел, чем упрощает архитектуру ЭВМ. В англоязычной литературе «обратный код» называют «дополнением единиц» (англ. “ones’ complement”), а «дополнительный код» называют «дополнением двойки» (англ. “two’s complement”).
Дополнительный код для отрицательного числа можно получить инвертированием его двоичного модуля и прибавлением к инверсии единицы, либо вычитанием числа из нуля.
Дополнительный код двоичного числа определяется как величина, полученная вычитанием числа из наибольшей степени двух (из 2N для N-битного второго дополнения).
Представление отрицательного числа в дополнительном коде[править | править код]
При записи числа в дополнительном коде старший разряд является знаковым. Если значение старшего разряда равно 0, то это значит, что в остальных разрядах записано положительное двоичное число, совпадающее с прямым кодом.
Двоичное 8-разрядное число со знаком в дополнительном коде может представлять любое целое в диапазоне от −128 до +127. Если старший разряд равен нулю, то наибольшее целое число, которое может быть записано в оставшихся 7 разрядах, равно .
Примеры:
Десятичное представление |
Двоичное представление (8 бит), код: | ||
---|---|---|---|
прямой | обратный | дополнительный | |
127 | 0111 1111
|
0111 1111
|
0111 1111
|
1 | 0000 0001
|
0000 0001
|
0000 0001
|
0 | 0000 0000
|
0000 0000
|
0000 0000
|
−0 | 1000 0000
|
1111 1111
|
— |
−1 | 1000 0001
|
1111 1110
|
1111 1111
|
−2 | 1000 0010
|
1111 1101
|
1111 1110
|
−3 | 1000 0011
|
1111 1100
|
1111 1101
|
−4 | 1000 0100
|
1111 1011
|
1111 1100
|
−5 | 1000 0101
|
1111 1010
|
1111 1011
|
−6 | 1000 0110
|
1111 1001
|
1111 1010
|
−7 | 1000 0111
|
1111 1000
|
1111 1001
|
−8 | 1000 1000
|
1111 0111
|
1111 1000
|
−9 | 1000 1001
|
1111 0110
|
1111 0111
|
−10 | 1000 1010
|
1111 0101
|
1111 0110
|
−11 | 1000 1011
|
1111 0100
|
1111 0101
|
−127 | 1111 1111
|
1000 0000
|
1000 0001
|
−128 | — | — | 1000 0000
|
Дополнительный код в иной системе счисления[править | править код]
Тот же принцип можно использовать и в компьютерном представлении любой системы счисления, например, для десятичных чисел.
Преобразования на примере десятичной системы счисления[1][править | править код]
Положительное число[править | править код]
Изменение значений текущих разрядов числа не производится, но дописывается знаковый старший разряд, значение которого равно 0. Например число [+12’345] будет иметь следующее представление – [012’345]
Отрицательное число[править | править код]
Дописываем знаковый старший разряд, равный большей цифре данной системы счисления, в нашем случае – это 9, а также изменяем остальные разряды по определённому правилу; пусть значение цифры каждого разряда будет представлено переменной x , кроме знакового, тогда представим следующий алгоритм действий:
- Присвоим переменной x новое значение, равное выражению 9 – x (процесс получения обратного кода) – например отрицательное число [-12345] в прямом коде от старшего к младшему разряду будет иметь вид [9′12345], где 9 – знаковая цифра, а в обратном представлении кода будет иметь следующий вид – [9’87654].
- К результирующему числу прибавим 1, так число [9’87654] (первое дополнение) будет иметь вид [987’655] (доп. код).
- Если возникла ситуация переноса разряда, в результате которого образовался новый разряд, то его (старший разряд) опускаем, а результирующее число считаем положительным. Результирующее положительное число будет одинаково представлено, как в прямом, так и в дополнительном коде. Например, имея возможность представить в таком виде отрицательный и положительный нуль, разберём их перевод в дополнительный код (1 знаковый и 4 дополнительных разряда):
- [+0] в прямом коде [0’0000]. Первое и второе дополнения равны [0’0000].
- [-0] в прямом коде [9’0000]. Первое дополнение – [9’9999]. При получении второго дополнения старший разряд числа [(1)0’0000] опускаем и получаем результирующее значение [0’0000], как у числа [+0].
Идея представления десятичного (как и любого другого) числа в дополнительном коде, идентична правилам для двоичной системы счисления и может использоваться в гипотетическом процессоре:
Привычное
представление |
Прямой
код |
Первое
дополнение |
Второе
дополнение |
---|---|---|---|
… | … | … | … |
+13 | 0’0013 | 0’0013 | 0’0013 |
+12 | 0’0012 | 0’0012 | 0’0012 |
+11 | 0’0011 | 0’0011 | 0’0011 |
+10 | 0’0010 | 0’0010 | 0’0010 |
+9 | 0’0009 | 0’0009 | 0’0009 |
+8 | 0’0008 | 0’0008 | 0’0008 |
… | … | … | … |
+2 | 0’0002 | 0’0002 | 0’0002 |
+1 | 0’0001 | 0’0001 | 0’0001 |
+0 | 0’0000 | 0’0000 | 0’0000 |
-0 | 9’0000 | 9’9999 | 0’0000 |
-1 | 9’0001 | 9’9998 | 9’9999 |
-2 | 9’0002 | 9’9997 | 9’9998 |
-3 | 9’0003 | 9’9996 | 9’9997 |
-4 | 9’0004 | 9’9995 | 9’9996 |
… | … | … | … |
-9 | 9’0009 | 9’9990 | 9’9991 |
-10 | 9’0010 | 9’9989 | 9’9990 |
-11 | 9’0011 | 9’9988 | 9’9989 |
-12 | 9’0012 | 9’9987 | 9’9988 |
-13 | 9’0013 | 9’9986 | 9’9987 |
Арифметика в дополнительном коде[править | править код]
Сложение и вычитание[править | править код]
Оба числа представляются в дополнительном коде. Дополнительный код обоих чисел имеет одинаковое количество разрядов. В данном представлении числа складываются.
Знаки разные: Если в процессе сложения образуется выходящий за пределы первоначальных чисел разряд, то он опускается. Результирующее значение считается положительным, где прямой и дополнительный коды являются идентичными. Иначе — отрицательным в виде дополнительного кода.
Например:
- [1234] + [-78] → [0’1234] + [9’9922] = [(1)0’1156] = [1156].
- [-1234] + [78] → [9’8766] + [0’0078] = [9’8844] = [-1156].
Знаки одинаковые:
- Положительные числа. Разряд не опускается, результат положительный.
- Отрицательные числа. Разряд опускается, результат отрицательный в дополнительном коде.
Например:
- [1234] + [78] → [0’1234] + [0’0078] = [0’1312] = [1312].
- [-1234] + [-78] → [9’8766] + [9’9922] = [(1)9’8688] → (первое дополнение) [0’1311] → (второе дополнение или обычное представление) [0’1312]. При переводе из дополнительного кода в обычное представление результирующее значение является абсолютным.
Преобразование в дополнительный код[править | править код]
Преобразование числа из прямого кода в дополнительный осуществляется по следующему алгоритму.
- Если старший (знаковый) разряд числа, записанного в прямом коде, равен 0, то число положительное и никаких преобразований не делается;
- Если старший (знаковый) разряд числа, записанного в прямом коде, равен 1, то число отрицательное, все разряды числа, кроме знакового, инвертируются, а к результату прибавляется 1.
Пример.
Преобразуем отрицательное число −5, записанное в прямом коде, в дополнительный код.
Прямой код отрицательного числа -5:
1000 0101
Инвертируем все разряды числа, кроме знакового, получая таким образом обратный код (первое дополнение) отрицательного числа -5:
1111 1010
Добавим к результату 1, получая таким образом дополнительный код (второе дополнение) отрицательного числа -5:
1111 1011
Для преобразования отрицательного числа -5, записанного в дополнительном коде, в положительное число 5, записанное в прямом коде, используется похожий алгоритм. А именно:
1111 1011
Инвертируем все разряды отрицательного числа -5, получая таким образом положительное число 4 в прямом коде:
0000 0100
Добавив к результату 1 получим положительное число 5 в прямом коде:
0101
И проверим, сложив с дополнительным кодом
0000 0101 + 1111 1011 = 0000 0000, пятый и старше разряды выбрасываются.
p-адические числа[править | править код]
В системе p-адических чисел изменение знака числа осуществляется преобразованием числа в его дополнительный код. Например, если используется 5-ичная система счисления, то число, противоположное 00015 (110), равно 44445 (−110).
Реализация алгоритма преобразования в дополнительный код (для 8-битных чисел)[править | править код]
Pascal[править | править код]
if (a < 0) then a := ((not a) or 128) + 1;
C/C++[править | править код]
int convert(int a) { if (a<0) a = ~(-a) + 1; return a; }
Преимущества и недостатки[править | править код]
Преимущества[править | править код]
- Общие инструкции (процессора) для сложения, вычитания и левого сдвига для знаковых и беззнаковых чисел (различия только в арифметических флагах, которые нужно проверять для контроля переполнения в результате).
- Отсутствие числа «минус ноль».
Недостатки[править | править код]
- Представление отрицательного числа визуально не читается по обычным правилам, для его восприятия нужен особый навык или дополнительные вычисления для приведения в обычный вид.
- В некоторых представлениях (например, двоично-десятичный код) или их составных частях (например, мантисса числа с плавающей запятой) дополнительное кодирование неудобно.
- Модуль наибольшего числа не равен модулю наименьшего числа. Например, для восьмибитного целого со знаком, максимальное число: 12710 = 011111112, минимальное число: -12810 = 100000002. Соответственно, не для любого числа существует противоположное. Операция изменения знака может потребовать дополнительной проверки.
Пример программного преобразования[править | править код]
Если происходит чтение данных из файла или области памяти, где они хранятся в двоичном дополнительном коде (например, файл WAVE), может оказаться необходимым преобразовать байты. Если данные хранятся в 8 битах, необходимо, чтобы значения 128-255 были отрицательными.
C# .NET / C style[править | править код]
byte b1 = 254; //11111110 (бинарное) byte b2 = 121; //01111001 (бинарное) byte c = 1<<(sizeof(byte)*8-1); //2 возводится в степень 7. Результат: 10000000 (бинарное) byte b1Conversion=(c ^ b1) - c; //Результат: -2. А фактически, двоичный дополнительный код. byte b2Conversion=(c ^ b2) - c; //Результат остаётся 121, потому что знаковый разряд - ноль.
Расширение знака[править | править код]
Расширение знака (англ. Sign extension) — операция над двоичным числом, которая позволяет увеличить разрядность числа с сохранением знака и значения. Выполняется добавлением цифр со стороны старшего значащего разряда. Если число положительное (старший разряд равен 0), то добавляются нули, если отрицательное (старший разряд равен 1) — единицы.
Пример[править | править код]
Десятичное число | Двоичное число
(8 разрядов) |
Двоичное число
(16 разрядов) |
---|---|---|
10 | 0000 1010
|
0000 0000 0000 1010
|
−15 | 1111 0001
|
1111 1111 1111 0001
|
См. также[править | править код]
- Обратный код
- Прямой код
- Целый тип
- Алгоритм Бута — специализированный алгоритм умножения для чисел в дополнительном коде
Литература[править | править код]
- Behrooz Parhami. 2.3. Complement Representation, 2.4. Two’s- and 1’s-complement numbers // Computer Arithmetic: Algorithms and Hardware Designs. — New York: Oxford University Press, 2000. — P. 22-27. — 510 p. — ISBN 0-19-512583-5.
- Самофалов К.Г., Романкевич А.М., Валуйский В.Н., Каневский Ю.С., Пиневич М.М. Прикладная теория цифровых автоматов. — К.: Вища школа, 1987. — 375 с.
Ссылки[править | править код]
- ↑ Florida Tech. Дата обращения: 28 ноября 2020. Архивировано 8 октября 2016 года.
Представление числа в дополнительном коде
При
записи числа в дополнительном коде
старший разряд является знаковым. Если
его значение равно 0, то в остальных
разрядах записано положительное двоичное
число, совпадающее спрямым
кодом. Если число, записанное в прямом
коде, отрицательное, то все разряды
числа инвертируются, а к результату
прибавляется 1. К получившемуся числу
дописывается старший (знаковый) разряд,
равный 1.
127
01111111
01111111
1
00000001
00000001
0
00000000
00000000
Преобразование
числа из прямого кода в дополнительный
осуществляется по следующему алгоритму.
-
Если число, записанное в прямом коде,
положительное, то к нему дописывается
старший (знаковый) разряд, равный 0, и
на этом преобразование заканчивается; -
Если число, записанное в прямом коде,
отрицательное, то все разряды числа
инвертируются,
а к результату прибавляется 1. К
получившемуся числу дописывается
старший (знаковый) разряд, равный 1.
Преимущества
-
Один и тот же регистр может хранить как
n-битовое положительное число, так
и (n−1)-битовое число со знаком, с
общими для обоих форматов операциями
сложения, вычитания и левого сдвига. -
Более удобная упаковка чисел в битовые
поля. -
Отсутствие числа «минус
ноль».
Недостатки
-
Дополнительный код неочевиден для
новичков. -
В сложных форматах (таких, как плавающая
запятаяилидвоично-десятичный
код) большинство преимуществ
аннулируются. -
Модуль наибольшего числа не равен
модулю наименьшего числа. Пример:
знаковое целое 8-байтовое. Максимальное
число: 12710== 7F16== 011111112.
Минимальное число: -12810==
8016,дополнительный код==
100000002,дополнительный код.
Соответственно, не для любого числа
существует противоположное. Операция
изменения знака может потребовать
дополнительной проверки.
11.
Представление дробных чисел в ЭВМ:
форматы с фиксированной, плавающей
точкой.
Память
ЭВМ построена из запоминающих элементов,
обладающих двумя устойчивыми состояниями,
одно из которых соответствует нулю, а
другое – единице. Таким физическим
элементом представляется в памяти ЭВМ
каждый разряд двоичного числа (бит).
Совокупность определенного количества
эти элементов служит для представление
многоразрядных двоичных чисел и
составляет разрядную сетку ЭВМ.
Каждая
группа из 8-ми запоминающих элементов
(байт) пронумерована. Номер байта
называется его адресом. Определенное
число последовательно расположенных
байт называется словом. Для разных ЭВМ
длина слова различна – два, четыре или
восемь байт. (Мне думается, что это
зависит от разрядности процессора).
С
фикс. Точкой:
При
представлении в ЭВМ чисел в естественной
форме устанавливается фиксированная
длина разрядной сетки. При этом
распределение разрядов между целой и
дробной частями остается неизменным
для любых чисел. В связи с эти в информатике
существует другое название естественной
формы представления чисел – с фиксированной
точкой (запятой).
Работая
на компьютере, мы можем вводить числа
с фиксированной запятой в любом виде.
Так же они будут высвечиваться на экране
компьютера, но перед занесением в память
компьютера они преобразуются в
соответствии с разрядной сеткой и
хранятся либо с запятой, фиксированной
после последнего разряда (целые числа),
либо с запятой перед старшим разрядом
дроби.
Любые
дробь и число в двоичной системе счисления
соответственно имебт вид: Дробь Целое.
С
плавающей:
Неудобство
представления чисел в форме с фиксированной
точкой проявляется при решении задач,
в которых фигурируют как очень малые
так и очень большие числа В конкретных
физических, математических и других
задачах диапазон изменения величин
может составлять, например от 10-30 до
1030. Можно убедиться, что в представлении
с фиксированной запятой понадобились
бы двоичные слова длинной около 256 бит
(32 байт), по 128 бит на целую и дробную
части. Однако работа ЭВМ с операндами
такой длины былабы крайне
неэффективной.
Точнось
числа определяется не его длиной, а
количеством верных значащих цифр.
Положение
запятой может изменяться. Поэтому в
информатике представление в ЭВМ числа
в экспотенциальной форме называются
представлением с плавающей точкой
(запятой). Для однозначности представления
чисел с плавающей точкой используется
нормализованная форма:
A
= m x q p,
–
где:
m
– мантиса числа,
q
– основание системы счисления,
p
– порядок числа.
12
Представление отрицательных чисел в
ЭВМ: прямой, смещенный коды.
Под системой
счисления понимается способ
представления любого числа с помощью
некоторого алфавита символов, называемых
цифрами. Существуют различные системы
счисления. От их особенностей зависят
наглядность представления числа при
помощи цифр и сложность выполнения
арифметических операций.
Наглядность
представления чисел и сравнительная
простота выполнения арифметических
операций характерны для позиционных
систем счисления.
Система
счисления называется позиционной, если
одна и та же цифра имеет различное
значение, определяющееся позицией цифры
в последовательности цифр, изображающей
число.
Позиционной
является десятичная система. В основе
десятичной системы лежат цифры от 0 до
9. Например, число 1 является единицей,
то же число занимающее вторую позицию
в последовательности 10 – является
десятком. Помимо десятичной существуют
другие позиционные системы. Некоторые
из них нашли применение в вычислительной
технике.
В
ЭВМ применяют позиционные системы
счисления с недесятичным основанием:
двоичную, шестнадцатеричную, восьмеричную
и др.
Наибольшее
распространение в ЭВМ имеет двоичная
система счисления. В этой системе
используются только две цифры: 0 и 1.
В
двоичной системе любое число может быть
представлено последовательностью
двоичных цифр
X=
am am-1….a0.a -1a -2….,
гдеа – либо 0, либо 1
m –
представляет позицию числа в
последовательности цифр.
Эта
запись соответствует сумме степеней
числа 2, взятых с указанными в ней
коэффициентами:
X
= am*2m +
am-1*2m-1 +
… + a0*20 +
a -1*2 –
1 +
a –
2*2 -2 +
…,
Например,
двоичное число
(10101
101.101)2 =
1*2 7 +
0*26 +
1*25 +
0*24 +
1*23 +
1*22 +
0*21 +
1*20 +
1*2 -1 +
0*2 -2 +
1*2 -3,
как
следует из приведенного разложения его
по степеням числа 2, соответствует
десятичному числу
(
173.625) 10.
В восьмеричной
системе употребляются восемь цифр:
0, 1, 2, 3, 4, 5, 6, 7. Любое число в
восьмеричной системе представляется
последовательностью цифр:
X= amam-1….a0.a-1a-2….,
где
а – могут принимать значения от 0 до
7. m –
представляет позицию числа в
последовательности цифр.
Например,
восьмеричное число
(703.04)8 =
7*8 2 +
0*81 +
3*80 +
0*8-1 +
4*8-2 =
(451. 0625)10,
В шестнадцатеричной
системе для изображения чисел
употребляются 16 цифр: от 0 до 15, при
этом, чтобы одну цифру не изображать
двумя знаками, приходится вводить
специальные обозначения для цифр,
больших девяти. Обозначим первые десять
цифр этой системы цифрами от 0 до 9, а
старшие пять цифр — латинскими буквами:
10 — А, 11 — В, 12 — С, 13 — D, 14
— Е, 15 — F.
Например,
шестнадцатеричное число
(В2Е.4)16=
11 * 162 +
2* 161 +
14* 160 +
4* 16-1 =
(2862.25) 10.
В
настоящее время в большинстве ЭВМ
используются двоичная система и
двоичный алфавит для представления и
хранения чисел, команд и другой
информации, а также при выполнении
арифметических и логических операций.
Шестнадцатеричная
и восьмеричная системы применяются в
текстах программ для более короткой и
удобной записи двоичных кодов команд,
адресов и операндов.
Прямой,
обратный и дополнительные коды.
Когда
числа записываются в десятичной системе,
часто число представляется в виде
абсолютной величины, которой предшествует
знак + или – указывающий на то, является
оно положительным или отрицательным.
Поэтому +125 является положительным
числом 125, а -125 — отрицательным числом
125. Для обработки как положительных,
так и отрицательных чисел ЭВМ должна
иметь некоторые средства различения
положительных и отрицательных чисел.
Машинное слово содержит разряд знака,
как правило предшествующий старшему
разряду в машинном слове.
Где 1
в разряде знака соответствует
отрицательному числу, а 0 в разряде
знака — положительному числу.
Выше
было рассмотрено представление числа
в виде знака и абсолютной величины.
Однако чаще используются системы записи
в обратном и дополнительном кодах. В
настоящее время дополнительный код
используется наиболее часто.
Преимущество
такого представления отрицательных
чисел состоит в том, что сумма и разность
как положительных, так и отрицательных
чисел могут вычисляться с помощью только
одного типа сумматора.
Существуют
три основные системы записи:
1. Отрицательные числа могут храниться в прямом коде.
Поэтому двоичное число -0011 будет храниться в виде
1.0011, где 1 указывает на то, что это число
отрицательное, а 0011 обозначает его
абсолютную величину.
2. Для
записи отрицательного числа можно
воспользоваться обратным кодом. При
этом двоичное число —0111 будет представлено
в виде 1.1000, где 1 указывает на то, что
число отрицательное. 1000 является
дополнением его абсолютной величины
до 1. (Дополнение абсолютной
величины до 1 получается
путем отрицания каждого ее бита.)
3. Для
представления отрицательных двоичных
чисел можно использовать дополнительный
код. Например, число —0111 будет храниться
как 1.1001, где 1 в разряде знака показывает,
что число отрицательное, 1001—дополнение его абсолютной
величины до двух. (Дополнение до двух
формируется путем
отрицания каждого бита абсолютной величины
0111, что дает 1000, и прибавлением 1
к младшему биту, в результате чего
получается 1001.)
Смысл
смещенного кода – представить числа со
знаком в виде беззнаковых так, чтобы
сохранился их естественный порядок.
При этом самое маленькое отрицательное
число представляется нулём, самое
большое положительное – числом из одних
единиц, а ноль попадает в середину
диапазона и представляется одной
единицей с нулями после нее.
Представление
числа в привычной форме “знак”-“величина”,
при которой старший разряд ячейки
отводится под знак, а остальные – под
запись числа в двоичной системе,
называется прямым
кодом двоичного
числа. Например, прямой код двоичных
чисел 1001 и -1001 для 8-разрядной ячейки
равен 00001001 и 10001001 соответственно.
Положительные
числа в ЭВМ всегда представляются с
помощью прямого кода. Прямой код числа
полностью совпадает с записью самого
числа в ячейке машины. Прямой код
отрицательного числа отличается от
прямого кода соответствующего
положительного числа лишь содержимым
знакового разряда. Но отрицательные
целые числа не представляются в ЭВМ с
помощью прямого кода, для их представления
используется так называемый дополнительный
код.
13 Энтропийный
подход к измерению объема информации.
Понятие вероятности, энтропии.
Количественный подход к измерению
объема данных. Единицы измерения.
Колличественный
подход:
Количество
информации можно рассматривать как
меру уменьшения неопределенности знания
при получении информационных сообщений.
Например,
сообщение о получении зачета приводит
к уменьшению неопределенности нашего
знания в 2 раза (один из двух возможных
вариантов). Сообщение об оценке за
экзамен (из 4 возможных вариантов – “5”,
“4”, “3” или “2”) уменьшает
неопределенность в 4 раза. Т.о., чем более
неопределенна первоначальная ситуация,
тем больше информации мы получим при
получении информационного сообщения.
Такой
подход позволяет количественно измерять
информацию:
,
где N -количество возможных информационных
сообщений, I – количество информации,
которое несет полученное сообщение.
Бит
– это количество информации, которое
уменьшает неопределенность знаний в 2
раза.
Поэтому,
сообщение о получении зачета несет 1
бит информации. Сообщение об оценке на
экзамене, несет 2 бита информации.
Сообщение о том в каком ряду и на каком
месте находится зритель в театре, если
всего 8 рядов по 16 мест, несет 7 бит
информации (8*16=128=27).
И
наоборот, если известно, что узнав номер
квартиры в которой живет человек, вы
получили 6 бит информации. то можно
определить, что в доме 64 квартиры.
8
бит = 1 байт, 1 Кбит = 1024 бит.
1
Кбайт = 1024 байт = 210 байт,
1 Мбайт = 1024 Кбайт = 210 Кбайт
= 220 байт, 1 Гбайт = 1024 Мбайт, 1 Терабайт =
1024 Гбайт.
Энтропия.
Энтропия
в информатике — степень неполноты,
неопределённости знаний.
Понятие
вероятности.
Вероя́тность (вероятностная
мера) — численная мера возможности
наступления некоторого события.
14 Понятие логических
значений, переменных, операций, функций,
таблиц истинности.
Лог. Значения:
-
true –
имеет смысл «да», «верно», «истина». -
false –
означает «нет», «неверно», «ложь».
Лог.
Переменные:
ЛОГИЧЕСКИЕ
ПЕРЕМЕННЫЕ [logical
variables] — знаки и формулы, которые могут
принимать различные значения в зависимости
от содержания обозначаемых ими
высказываний.
Лог.
Операции:
ЛОГИЧЕСКИЕ
ОПЕРАЦИИ [logical
operations]. С какой-то степенью точности
можно сказать, что математическая логика
занимается изучением правил вывода
определенных положений без конкретизации
самих этих положений (безотносительно
к их содержанию), примерно так, как
геометрия связана с наукой о пространстве.
Одно из
основных понятий математической логики
— высказывание.
Не стремясь к излишней математической
строгости, можно сказать, что высказывание
— это выражение, относительно которого
можно сделать вывод o его истинности
или ложности. Напр., “Ах!” — это не
высказывание. А выражение “Иван Иванович
Иванов ~ телевизор” — высказывание,
так как можно утверждать: оно ложно.
Знак ~ заменяет
здесь слово “эквивалент” и связывает
два имени: “Иван Иванович Иванов” и
“телевизор”. Каждое из этих имен
высказыванием не является, тогда как
все выражение — высказывание.
Над высказываниями
можно производить определенные операции.
Напр., если заданы два высказывания,
обозначенные логическими переменными
A и B, то можно составить новое высказывание
“A и B”.
При этом связка “и” заменяется символом;
тогда запишем “A ^ B”.
Можно также составить выражение
“A или B”.
Связка “или” обозначается с помощью
символа v. Можно представить высказывание
“из A следует B”:
“A => B”.
Наконец, можно составить отрицание
данного высказывания: “не A”.
Другие
операции:
Конъюнкция |
Дизъюнкция |
||||
A |
B |
A^B |
A |
B |
AvB |
И |
И |
И |
И |
И |
И |
И |
Л |
Л |
И |
Л |
И |
Л |
И |
Л |
Л |
И |
И |
Л |
Л |
Л |
Л |
Л |
Л |
Импликация |
Эквивалентность |
||||
A |
B |
A=>B |
A |
B |
A≡B |
И |
И |
И |
И |
И |
И |
И |
Л |
Л |
И |
Л |
Л |
Л |
И |
И |
Л |
И |
Л |
Л |
Л |
И |
Л |
Л |
И |
Таблица истинности:
Таблица |
15 Совершенные
конъюнктивные и дизъюнктивные нормальные
формы логических функций.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Пользователь Евгений попросил нас сделать перевод из прямого в дополнительный или обратный коды.
Далее идет калькулятор, который переводит введенное положительное или отрицательное целое число в двоичный код, а также выводит обратный код этого числа и его дополнительный код. Под калькулятором, как водится, немного теории.
Обновление: Из комментариев становится ясно, что люди не вполне понимают, что делает этот калькулятор. Точнее, что делал — применял алгоритм вычисления дополнительного кода к любому числу. Люди хотят, чтобы он им просто показывал дополнительный код числа. Ну хорошо — теперь при вводе положительного числа калькулятор показывает представление числа в двоичной форме, ибо для него нет обратного и дополнительного кода, а при вводе отрицательного показывает дополнительный и обратный код.
Прямой, дополнительный и обратный код
Представление положительного числа
Итак, теория
Прямой код числа это представление беззнакового двоичного числа. Если речь идет о машинной арифметике, то как правило на представление числа отводится определенное ограниченное число разрядов. Диапазон чисел, который можно представить числом разрядов n равен
Обратный код числа, или дополнение до единицы (one’s complement) это инвертирование прямого кода (поэтому его еще называют инверсный код). То есть все нули заменяются на единицы, а единицы на нули.
Дополнительный код числа, или дополнение до двойки (two’s complement) это обратный код, к младшему значащему разряду которого прибавлена единица
А теперь «зачем, зачем это все?» ©
А это все для удобной работы со знаками. Поскольку я все люблю понимать на примерах, рассказывать я тоже буду на примерах. Итак, предположим, что у нас 4 разряда для работы с двоичными числами. Представить таким образом можно 16 чисел — 0, 1, … 15
00 — 0000
…
15 — 1111
Но если нет знака, убогая получается арифметика. Нужно вводить знак. Чтобы никого не обидеть, половину диапазона отдадим положительным числам (8 чисел), половину — отрицательным (тоже 8 чисел). Ноль, что отличает машинную арифметику от обычной, мы отнесем в положительные числа (в обычной арифметике у нуля нет знака, если не ошибаюсь). Итого, в положительные числа попадают 0,…,7, а в отрицательные -1, …, -8.
Для различия положительных и отрицательных чисел выделяют старший разряд числа, который называется знаковым (sign bit)
0 в этом разряде говорит нам о том, что это положительное число, а 1 — отрицательное.
С положительными числами все вроде бы понятно, для их представления можно использовать прямой код
0 — 0000
1 — 0001
7 — 0111
А как представить отрицательные числа?
Вот для их представления как раз и используется дополнительный код.
То есть, -7 в дополнительном коде получается так
прямой код 7 = 0111
обратный код 7 = 1000
дополнительный код 7 = 1001
Обратим внимание на то, что прямой код 1001 представляет число 9, которое отстоит от числа -7 ровно на 16, или .
Или, что тоже самое, дополнительный код числа “дополняет” прямой код до , т.е. 7+9=16
И это оказалось очень удобно для машинных вычислений — при таком представлении отрицательного числа операции сложения и вычитания можно реализовать одной схемой сложения, при этом очень легко определять переполнение результата (когда для представления получившегося числа не хватает разрядности)
Пара примеров
7-3=4
0111 прямой код 7
1101 дополнительный код 3
0100 результат сложения 4
-1+7=6
1111 дополнительный код 1
0111 прямой код 7
0110 результат сложения 6
Что касается переполнения — оно определяется по двум последним переносам, включая перенос за старший разряд. При этом если переносы 11 или 00, то переполнения не было, а если 01 или 10, то было. При этом, если переполнения не было, то выход за разряды можно игнорировать.
Примеры где показаны переносы и пятый разряд
7+1=8
00111 прямой код 7
00001 прямой код 1
01110 переносы
01000 результат 8 — переполнение
Два последних переноса 01 — переполнение
-7+7=0
00111 прямой код 7
01001 дополнительный код 7
11110 переносы
10000 результат 16 — но пятый разряд можно игнорировать, реальный результат 0
Два последних переноса 11 з перенос в пятый разряд можно отбросить, оставшийся результат, ноль, арифметически корректен.
Опять же проверять на переполнение можно простейшей операцией XOR двух бит переносов.
Вот благодаря таким удобным свойствам дополнительный код это самый распространенный способ представления отрицательных чисел в машинной арифметике.
P.S. Ну а обратный код дополняет число до , или до всех 1, потому и называется дополнением до 1. Им тоже можно представлять отрицательные числа, и реализовать вычитание и сложение схемой сложения, только сложение там хитрее — с циклическим переносом, ну и представить можно меньше на одно число, так как все единицы уже заняты — это обратный код нуля, эдакий «минус нуль», то есть диапазон получается, если брать наш пример от -7 до 7. Не так удобно, одним словом.