Разное

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

Содержание

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

Прямой код

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

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

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

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

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

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

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

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

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

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

1 1110011 + 1 = 1 1110100

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

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

Операция сложения положительного числа и отрицательного числа, представленного в прямом коде

  1. Прямой код числа 5: 0 000 0101
    Прямой код числа -7: 1 000 0111
  2. Два исходных числа сравниваются. В разряд знака результата записывается знак большего исходного числа.
  3. Если числа имеют разные знаки, то вместо операции сложения используется операция вычитания из большего по модулю значения меньшего. При этом первый (знаковый) разряд в операции не участвует.
        _ 000 0111
          000 0101
        -------------
          000 0010
        
  4. После выполнения операции учитывается первый разряд. Результат операции 1 000 0010, или -210.

Операция сложения положительного числа и отрицательного числа, представленного в дополнительном коде

  1. Прямой код числа 5: 0 000 0101
    Прямой код числа -7: 1 000 0111
  2. Формирование дополнительного кода числа -7.
    Прямой код : 1 000 0111
    Инверсия : 1 111 1000
    Добавление единицы: 1 111 1001
  3. Операция сложения.
          0 000 0101
        + 1 111 1001
          --------------
          1 111 1110
        
  4. Проверка результата путем преобразования к прямому коду.
    Дополнительный код: 1 111 1110
    Вычитание единицы : 1 111 1101
    Инверсия : 1 000 0010 (или -210)

Дополнительный код (представление числа)

Материал из Seo Wiki — Поисковая Оптимизация и Программирование

Дополнительный код (англ. two’s complement, иногда twos-complement) — наиболее распространённый способ представления отрицательных целых чисел в компьютерах. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел, чем упрощает архитектуру ЭВМ. Дополнительный код отрицательного числа можно получить инвертированием модуля двоичного числа (первое дополнение) и прибавлением к инверсии единицы (второе дополнение). Либо вычитанием числа из нуля.

Дополнительный код (дополнение до 2) двоичного числа получается добавлением 1 к младшему значащему разряду его дополнения до 1.
[1]

Дополнение до 2 двоичного числа определяется как величина полученная вычитанием числа из наибольшей степени двух (из 2N для N-битного дополнения до 2).[2]

Представление числа в дополнительном коде

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

Двоичное 8-ми разрядное число со знаком в дополнительном коде может представлять любое целое в диапазоне от −128 до +127. Если старший разряд равен нулю, то наибольшее целое число, которое может быть записано в оставшихся 7 разрядах равно <math>2^7-1</math>, что равно 127.

Примеры:

Десятичное
представление
Код двоичного представления (8 бит)
прямой дополнительный
127                 01111111                 01111111                
1                 00000001                 00000001                
0                 00000000                 00000000                
-0                 10000000                 ———                
-1                 10000001                 11111111                
-2                 10000010                 11111110                
-3                 10000011                 11111101                
-4                 10000100                 11111100                
-5                 10000101                 11111011                
-6                 10000110                 11111010                
-7                 10000111                 11111001                
-8                 10001000                 11111000                
-9                 10001001                 11110111                
-10                 10001010                 11110110                
-11                 10001011                 11110101                
-127                 11111111                 10000001                
-128                 ———                 10000000                

При применении той же идеи к привычной 10-ричной системе счисления получится (например, для гипотетического процессора использующего 10-ричную систему счисления):

10-ричная система счисления
(«обычная» запись)
10-ричная система счисления,
дополнительный код
130013
120012
110011
100010
90009
80008
20002
10001
00000
-19999
-29998
-39997
-49996
-99991
-109990
-119989
-129988

Преобразование дополнительного кода

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

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

Пример.
Преобразуем отрицательное число −5, записанное в прямом коде, в дополнительный.
Прямой код числа −5, взятого по модулю:

101 

Инвертируем все разряды числа, получая таким образом обратный код:

010

Добавим к результату 1

011

Допишем слева знаковый единичный разряд

1011

Для обратного преобразования используется тот же алгоритм. А именно:

1011

Инвертируем все разряды числа, получая таким образом обратный код:

0100

Добавим к результату 1 и проверим, сложив с дополнительным кодом

 0101 + 1011 = 10000, пятый разряд выбрасывается.

Дополнительный код для десятичных чисел

Тот же принцип можно использовать и в компьютерном представлении десятичных чисел: для каждого разряда цифра X заменяется на 9−X, и к получившемуся числу добавляется 1. Например, при использовании четырёхзначных чисел −0081 заменяется на 9919 (9919+0081=0000, пятый разряд выбрасывается).

Реализация алгоритма преобразования в обратный код

Pascal

if a<0
  then a:=(not a) or 128;

C/C++

Преимущества и недостатки

Преимущества

  • Один и тот же регистр может хранить как n-битовое положительное число, так и (n−1)-битовое число со знаком, с общими для обоих форматов операциями сложения, вычитания и левого сдвига.
  • Более удобная упаковка чисел в битовые поля.
  • Отсутствие числа «минус ноль».

Недостатки

  • Дополнительный код неочевиден для новичков.
  • В сложных форматах (таких, как плавающая запятая или двоично-десятичный код) большинство преимуществ аннулируются.
  • Модуль наибольшего числа не равен модулю наименьшего числа. Пример: знаковое целое 1-байтовое. Максимальное число: 12710 == 7F16 == 011111112. Минимальное число: -12810 == 8016,дополнительный код == 100000002,дополнительный код. Соответственно, не для любого числа существует противоположное. Операция изменения знака требует дополнительной проверки.

Пример программного преобразования

Если происходит чтение данных из файла или области памяти, где они хранятся в двоичном дополнительном коде (например, файл WAVE), может оказаться необходимым преобразовать байты. Если данные хранятся в 8 битах, необходимо, чтобы значения 128-255 были отрицательными.

C# .NET / C style

byte b1 = 254; //11111110 (бинарное)
byte b2 = 121; //01111001 (бинарное)
int c = (int)Math.Pow(2,(sizeof(byte)*8)-1);  //2 возводится в степень 7. Результат: 10000000 (бинарное)
int b1Conversion=(c ^ b1) - c;  //Результат: -2. А фактически, двоичный дополнительный код.
int b2Conversion=(c ^ b2) - c;  //Результат остаётся 121, потому что знаковый разряд - нуль.

См. также

Ссылки

  1. ↑ http://matlab.exponenta.ru/fixedpoint/book1/1.php К.Г.Жуков «Справочное руководство пользователя Fixed-Point Blockset» 1.2. Понятие прямого, обратного и дополнительного кодов, Определение 3.
  2. ↑ http://en.wikipedia.org/wiki/Two’s_complement

Дополнительный код двоичного числа, отрицательные двоичные числа.

Билеты для подготовки к экзамену по Информатике. Трофимов Владислав, Махонин Кирилл

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

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

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

Для положительных знаковых и беззнаковых чисел:

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

Для отрицательных:

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

Пример:

12710: Прямой код = 011111112 = Обратный = Дополнительный.

-12710: Прямой код = 111111112, Обратный = 100000002, Дополнительный = 100000012.

7

Билеты для подготовки к экзамену по Информатике. Трофимов Владислав, Махонин Кирилл

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

Для дробных двоичных чисел можно применять однобайтное представление: *знак+*порядок+*мантисса+. Под знак отводится 1 бит, под порядок 3, под мантиссу 4.

Знак

0 – Число положительно

1 – Число отрицательно

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

Мантисса – значащие цифры числа в прямом представлении.

В двухбайтном представлении под порядок отводится 4 бита, под мантиссу 11.

Пример:

1 0101 01101101101

— -3 0.00001101101101

− 877

Ответ: 16384

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

Двоичная нотация с избытком

Для любой системы счисления вычитаем из числа 2^(порядок системы счисления – 1).

Пример:

0012 = 1. 1 – 4 = -3.

Число при нотации с избытком

«Реальное» значение числа

 

 

111

3

 

 

110

2

 

 

101

1

 

 

100

0

 

 

011

-1

 

 

010

-2

 

 

001

-3

 

 

000

-4

 

 

8

Билеты для подготовки к экзамену по Информатике. Трофимов Владислав, Махонин Кирилл

Арифметические действия с двоичными числами, сдвиг влево, сдвиг вправо

Арифметические действия:

Сложение

Вычитание (за счет дополнительного кода сводится к операции сложения)

Сдвиг влево

Сдвиг вправо

Сдвиг влево аналогичен операции умножить на 2. Сдвиг вправо аналогичен операции разделить на 2 без остатка.

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

Любой новый байт, который появляется при сдвиге, равен 0.

Число

0

0

0

0

1

0

1

0

 

 

 

 

 

 

 

 

 

Число << 2

0

0

1

0

1

0

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Число

0

0

0

0

1

1

1

0

 

 

 

 

 

 

 

 

 

Число >> 3

0

0

0

0

0

0

1

1

 

 

 

 

 

 

 

 

 

9

Билеты для подготовки к экзамену по Информатике. Трофимов Владислав, Махонин Кирилл

Логические операции и их свойства

Операция

Описание

a

b

Результат

! , NOT a,

Отрицание. Инвертирует биты (1=0, 0=1)

1

0

,

Логическое И (1 и 1 = 1, иначе 0)

1

0

0

+ ,

Логическое ИЛИ (0 и 0 = 0, иначе 1)

0

1

1

,

XOR (0 и 0 = 0, 1 и 1 = 0, иначе 1)

1

0

1

 

 

 

 

 

< − > ,

Эквивалентность, равенство. (0 и 0 = 1, 1 и 1 = 1, иначе 0)

1

1

1

 

 

 

 

 

Логическое следование (1 и 0 = 0, иначе 1)

1

1

1

Приоритет операций:

1.not

2.and

3.or,xor,

4.→

10

Перевод чисел из одной системы счисления в любую другую онлайн

  • Главная
  • Конвертеры
  • Инструменты
  • Перевод чисел из одной системы счисления в любую другую онлайн

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

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

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

Способы перевода чисел из одной системы счисления в другую

В программу ЕГЭ по информатике входят несколько задач, связанных с переводом чисел из одной системы в другую. Как правило, это преобразование между 8- и 16-ричными системами и двоичной. Это разделы А1, В11. Но есть и задачи с другими системами счисления, как например, в разделе B7.

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

Таблица степеней числа 2:



212223242526272829210
2481632641282565121024

Она легко получается умножением предыдущего числа на 2. Так, что если помните не все эти числа, остальные нетрудно получить в уме из тех, которые помните.

Таблица двоичных чисел от 0 до 15 c 16-ричным представлением:




0123456789101112131415
0000000100100011010001010110011110001001101010111100110111101111
0123456789ABCDEF

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

Арифметические операции в двоичной системе счисления






Сложение

Вычитание

Умножение

0+0=0

0-0=0

0*0=0

1+0=1

1-0=1

1*0=0

0+1=1

0-1=1

0*1=0

1+1=10

1-1=0

1*1=1

При сложении двух чисел, равных 1, в данном разряде получается 0, а 1-ца переносится в старший разряд.

Перевод целых чисел

Итак, начнем с перевода сразу в двоичную систему. Возьмём то же число 81010. Нам нужно разложить это число на слагаемые, равные степеням двойки.

  1. Ищем ближайшую к 810 степень двойки, не превосходящую его. Это 29 = 512.
  2. Вычитаем 512 из 810, получаем 298.
  3. Повторим шаги 1 и 2, пока не останется 1 или 0.
  4. У нас получилось так: 810 = 512 + 256 + 32 + 8 + 2 = 29 + 28 + 25 + 23 + 21.

Далее есть два способа, можно использовать любой из них. Как легко увидеть, что в любой системе счисления её основание всегда 10. Квадрат основания всегда будет 100, куб 1000. То есть степень основания системы счисления — это 1 (единица), и за ней столько нулей, какова степень.

Способ 1: Расставить 1 по тем разрядам, какие получились показатели у слагаемых. В нашем примере это 9, 8, 5, 3 и 1. В остальных местах будут стоять нули. Итак, мы получили двоичное представление числа 81010 = 11001010102. Единицы стоят на 9-м, 8-м, 5-м, 3-м и 1-м местах, считая справа налево с нуля.

Способ 2: Распишем слагаемые как степени двойки друг под другом, начиная с большего.

810 =






29 =1000000000(1 и девять нулей) +
28 =100000000(1 и восемь нулей) +
25 =100000(1 и пять нулей) +
23 =1000(1 и три нуля) +
21 =10(1 и один ноль)

А теперь сложим эти ступеньки вместе, как складывают веер: 1100101010.

Вот и всё. Попутно также просто решается задача «сколько единиц в двоичной записи числа 810?».

Ответ — столько, сколько слагаемых (степеней двойки) в таком его представлении. У 810 их 5.

Теперь пример попроще.

Переведём число 63 в 5-ричную систему счисления. Ближайшая к 63 степень числа 5 — это 25 (квадрат 5). Куб (125) будет уже много. То есть 63 лежит между квадратом 5 и кубом. Тогда подберем коэффициент для 52. Это 2.

Получаем 6310 = 50 + 13 = 50 + 10 + 3 = 2 * 52 + 2 * 5 + 3 = 2235.

Ну и, наконец, совсем лёгкие переводы между 8- и 16-ричными системами. Так как их основанием является степень двойки, то перевод делается автоматически, просто заменой цифр на их двоичное представление. Для 8-ричной системы каждая цифра заменяется тремя двоичными разрядами, а для 16-ричной четырьмя. При этом все ведущие нули обязательны, кроме самого старшего разряда.

Переведем в двоичную систему число 5478.



5478=101100111
 547

Ещё одно, например 7D6A16.



7D6A16=(0)111110101101010
 7D6A

Переведем в 16-ричную систему число 7368. Сначала цифры запишем тройками, а потом поделим их на четверки с конца: 7368 = 111 011 110 = 1 1101 1110 = 1DE16. Переведем в 8-ричную систему число C2516. Сначала цифры запишем четвёрками, а потом поделим их на тройки с конца: C2516 = 1100 0010 0101 = 110 000 100 101 = 60458. Теперь рассмотрим перевод обратно в десятичную. Он труда не представляет, главное не ошибиться в расчётах. Раскладываем число на многочлен со степенями основания и коэффициентами при них. Потом всё умножаем и складываем. E6816 = 14 * 162 + 6 * 16 + 8 = 3688. 7328 = 7 * 82 + 3*8 + 2 = 474.

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

Здесь нужно учесть, что число будет представлено в дополнительном коде. Для перевода числа в дополнительный код нужно знать конечный размер числа, то есть во что мы хотим его вписать — в байт, в два байта, в четыре. Старший разряд числа означает знак. Если там 0, то число положительное, если 1, то отрицательное. Слева число дополняется знаковым разрядом. Беззнаковые (unsigned) числа мы не рассматриваем, они всегда положительные, а старший разряд в них используется как информационный.

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

Итак, переведем число -79 в двоичную систему. Число займёт у нас один байт.

Переводим 79 в двоичную систему, 79 = 1001111. Дополним слева нулями до размера байта, 8 разрядов, получаем 01001111. Меняем 1 на 0 и 0 на 1. Получаем 10110000. К результату прибавляем 1, получаем ответ 10110001.

Попутно отвечаем на вопрос ЕГЭ «сколько единиц в двоичном представлении числа -79?».

Ответ — 4.

Прибавление 1 к инверсии числа позволяет устранить разницу между представлениями +0 = 00000000 и -0 = 11111111. В дополнительном коде они будут записаны одинаково 00000000.

Перевод дробных чисел

Дробные числа переводятся способом, обратным делению целых чисел на основание, который мы рассмотрели в самом начале. То есть при помощи последовательного умножения на новое основание с собиранием целых частей. Полученные при умножении целые части собираются, но не участвуют в следующих операциях. Умножаются только дробные. Если исходное число больше 1, то целая и дробная части переводятся отдельно, потом склеиваются.

Переведем число 0,6752 в двоичную систему.















0,6752
 *2
1,3504
 *2
0,7008
 *2
1,4016
 *2
0,8032
 *2
1,6064
 *2
1,2128

Процесс можно продолжать долго, пока не получим все нули в дробной части или будет достигнута требуемая точность. Остановимся пока на 6-м знаке.

Получается 0,6752 = 0,101011.

Если число было 5,6752, то в двоичном виде оно будет 101,101011.

В вашем браузере отключен Javascript.
Чтобы произвести расчеты, необходимо разрешить элементы ActiveX!

Дополнительный код (представление числа) — это… Что такое Дополнительный код (представление числа)?

Дополнительный код (англ. two’s complement, иногда twos-complement) — наиболее распространённый способ представления отрицательных целых чисел в компьютерах. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел, чем упрощает архитектуру ЭВМ. Дополнительный код отрицательного числа можно получить инвертированием модуля двоичного числа (первое дополнение) и прибавлением к инверсии единицы (второе дополнение), либо вычитанием числа из нуля.

Дополнительный код (дополнение до 2) двоичного числа получается добавлением 1 к младшему значащему разряду его дополнения до 1. [1]

Дополнение до 2 двоичного числа определяется как величина полученная вычитанием числа из наибольшей степени двух (из 2N для N-битного дополнения до 2).

Представление отрицательного числа в дополнительном коде

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

Двоичное 8-ми разрядное число со знаком в дополнительном коде может представлять любое целое в диапазоне от −128 до +127. Если старший разряд равен нулю, то наибольшее целое число, которое может быть записано в оставшихся 7 разрядах равно , что равно 127.

Примеры:

Десятичное
представление
Код двоичного представления (8 бит)
прямойобратныйдополнительный
127       01111111       01111111       01111111       
1       00000001       00000001       00000001       
0       00000000       00000000       00000000       
-0       10000000       11111111       —       
-1       10000001       11111110       11111111       
-2       10000010       11111101       11111110       
-3       10000011       11111100       11111101       
-4       10000100       11111011       11111100       
-5       10000101       11111010       11111011       
-6       10000110       11111001       11111010       
-7       10000111       11111000       11111001       
-8       10001000       11110111       11111000       
-9       10001001       11110110       11110111       
-10       10001010       11110101       11110110       
-11       10001011       11110100       11110101       
-127       11111111       10000000       10000001       
-128       —       —       10000000       

Дополнительный код для десятичных чисел

Тот же принцип можно использовать и в компьютерном представлении десятичных чисел: для каждого разряда цифра X заменяется на 9−X, и к получившемуся числу добавляется 1. Например, при использовании четырёхзначных чисел −0081 заменяется на 9919 (9919+0081=0000, пятый разряд выбрасывается).

При применении той же идеи к привычной 10-ричной системе счисления получится (например, для гипотетического процессора использующего 10-ричную систему счисления):

10-ричная система счисления
(«обычная» запись)
10-ричная система счисления,
дополнительный код
130013
120012
110011
100010
90009
80008
20002
10001
00000
-19999
-29998
-39997
-49996
-99991
-109990
-119989
-129988

Преобразование в дополнительный код

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

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

Пример. Преобразуем отрицательное число −5, записанное в прямом коде, в дополнительный. Прямой код числа −5, взятого по модулю:

101 

Инвертируем все разряды числа, получая таким образом обратный код:

010

Добавим к результату 1

011

Допишем слева знаковый единичный разряд

1011

Для обратного преобразования используется тот же алгоритм. А именно:

1011

Инвертируем все разряды числа, получая таким образом обратный код:

0100

Добавим к результату 1 и проверим, сложив с дополнительным кодом

 0101 + 1011 = 10000, пятый разряд выбрасывается.

p-адические числа

В системе p-адических чисел изменение знака числа осуществляется преобразованием числа в его дополнительный код. Например, если используется 5-ричная система счисления, то число, противоположное 1000… (1) равно 4444…. (−1).

Реализация алгоритма преобразования в обратный код (для 8-битных чисел)

Pascal

if a<0
  then a:=((not a) or 128) + 1;

C/C++

if (a < 0)
  a = ( (~(-a))|128 ) + 1;

Преимущества и недостатки

Преимущества

  • Один и тот же регистр может хранить как n-битовое положительное число, так и (n−1)-битовое число со знаком, с общими для обоих форматов операциями сложения, вычитания и левого сдвига.
  • Более удобная упаковка чисел в битовые поля.
  • Отсутствие числа «минус ноль».

Недостатки

  • Дополнительный код неочевиден для новичков.
  • В сложных форматах (таких, как плавающая запятая или двоично-десятичный код) большинство преимуществ аннулируются.
  • Модуль наибольшего числа не равен модулю наименьшего числа. Пример: знаковое целое 8-битовое. Максимальное число: 12710 == 7F16 == 011111112. Минимальное число: -12810 == 8016,дополнительный код == 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, потому что знаковый разряд - нуль.

См. также

Литература

  • 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 с.

Ссылки

  1. К.Г.Жуков «Справочное руководство пользователя Fixed-Point Blockset» 1.2. Понятие прямого, обратного и дополнительного кодов, Определение 3. Архивировано из первоисточника 23 июня 2012.

Выучите двоичные отрицательные числа и дополнение до 2

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

Дополнение к положительным числам.

Введение

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

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

Величина знака — простой подход

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

Знаковой величиной мы обозначаем один из битов (обычно крайний левый, также известный как самый старший бит), чтобы указать, является ли число положительным или отрицательным. Обычно «0» указывает на положительное число, а «1» указывает на отрицательное значение. Таким методом получаем:

Приведенный выше пример иллюстрирует важный момент при работе с отрицательными числами в двоичном формате.Поскольку мы должны назначить конкретный бит индикатором sign , мы должны указать, сколько битов будут представлены числа, и соответственно дополнить. В приведенном выше примере числа представлены с использованием 8 бит. Вы могли бы так же легко использовать 16, 32, 64 бит и т. Д.

Наблюдения

Представление отрицательных чисел в двоичном формате имеет некоторые интересные побочные эффекты.

Наибольшее число, которое мы можем представить (при заданном количестве бит фактически уменьшается вдвое.Это связано с тем, что количество комбинаций единиц и нулей по-прежнему остается прежним, но теперь половина из них используется для представления отрицательных чисел. Фактически, при величине знака у нас фактически чуть меньше половины, потому что ноль может быть представлен как 1000000 или 00000000 . С беззнаковыми (или без отрицательных чисел) с 8 битами имеем:

  • 00000000 — представляет 0, наименьшее возможное число.
  • 11111111 — 255, максимально возможное число.
  • Всего представлено 256 возможных чисел.

Тогда как со знаковой величиной имеем:

  • 11111111 — представляет -127, наименьшее возможное число.
  • 10000000 — что составляет 0.
  • 00000000 — тоже 0.
  • 01111111 — это 127, максимально возможное число.
  • Всего представлено 255 возможных чисел.

Мы упоминали выше, что крайний левый бит обычно обозначается как тот, который указывает знак числа, и что из-за этого нам нужно указать, сколько битов будет использоваться, и что каждое число должно быть дополнено до это количество бит. Кто-то может спросить, почему это так? Например, почему бы и нет:

Используйте только необходимое количество битов и сделайте последний бит только битом знака. например:

  • 4 может быть представлено как: 0100
  • -4 как: 1100
  • 9 представлено как: 01001
  • -9 как: 11001
  • и т. Д.

Или поместите знаковый бит как самый правый бит.например:

  • 4 можно представить как: 1000
  • -4 как: 1001
  • 9 представлено как: 10010
  • -9 как: 10011
  • и т. Д.

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

И, наконец, арифметика? К сожалению, при таком способе представления положительных и отрицательных чисел нецелесообразно выполнять с ними арифметические операции. Вот почему в реальном мире величина знака используется очень редко. Однако важно понимать величину знака (и ее недостатки), чтобы полностью понять, почему метод дополнения 2 (поясняется ниже) является предпочтительным методом.

Дополнение 1

Дополнение

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

Для знака величины:

  • 4 будет представлено как: 00000100
  • -4 будет представлено как: 100000100

С дополнением на 1 имеем:

  • 4 будет представлено как: 00000100
  • -4 будет представлен как: 11111011

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

Дополнение 2

Дополнение

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

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

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

В обычном двоичном формате без знака мы можем представить 16 значений (от 0 до 15). 4 бита (слева направо) представляют 8, 4, 2 и 1.

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

Давайте посмотрим на простой пример. В демонстрации ниже вы можете ввести различные 4-битные или 8-битные двоичные числа со знаком и посмотреть, как они преобразуются в десятичные значения.

4 бита 8 бит

Промежуточная сумма в десятичном формате:

Преобразование в и из дополнения 2

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

Преобразование десятичной дроби в 2-дополнение включает в себя еще несколько шагов, но это не так уж сложно.

Если число положительное, то мы можем преобразовать так же, как и для беззнакового двоичного файла. Однако мы должны заполнить нулями необходимое количество бит. например. если мы работаем с 8 битами и нам нужно представить 6, тогда:

  • Десятичная 6 переводится в двоичную систему как 110
  • Заполнение становится 00000110

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

Давайте разберемся

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

Шаги 1, 2 и 3 довольно просты. Рассмотрим подробнее шаги 4 и 5.

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

  • 3 бита, то максимальное значение, которое мы можем представить, равно 7, то есть 111.
  • Если у нас есть число 2, то это 010 в двоичном формате (с дополнением).
  • Обращение цифр дает 101, что равно 5.
  • 5 + 2 = 7

Если бы мы сказали 5 минус 7, мы получили бы -2, что является нашим предполагаемым значением.Однако мы всегда будем вычитать число 1, превышающее максимальное число (в двоичной системе следующая цифра слева всегда будет на 1 больше, чем максимальное значение всех предыдущих битов).

Помните, что крайний левый бит является отрицательным по отношению к своему нормальному значению, поэтому здесь у нас будет 4-й бит, который обычно равен 8, но теперь равен -8 (отрицательный 1 больше, чем максимум 7 из первых 3 бит). Инвертируя биты, мы устанавливаем это значение в 1, что означает, что он станет 5 минус 8, что равно -3.Затем мы добавляем 1, чтобы отрегулировать это, возвращая его к -2.

Что, если мы получим число больше, чем мы можем представить?

С ванильным (или беззнаковым) двоичным кодом это не проблема, если нам нужно большее число, мы можем просто добавить больше бит соответственно. Однако при использовании двоичного кода со знаком нам нужно утомиться, что количество используемых битов указано заранее, и нам нужно придерживаться этого. Если нам нужно представить большее значение, тогда нам нужно увеличить общее количество используемых бит, например, перейти с 8 бит на 16 бит, помня, что все числа, с которыми мы работаем, нужно будет отрегулировать, или просто принять, что это не может быть сделано.

Арифметика с дополнением до 2

Давайте посмотрим, как мы можем выполнять сложение и вычитание, используя числа с дополнением до 2. По сути, мы делаем то же самое, что и для обычных двоичных чисел без знака. Однако когда мы подходим к последнему шагу, есть небольшое изменение.

Есть несколько сценариев, на которые нам нужно обратить внимание:

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

Переполнение возможно только в том случае, если два числа, которые нужно сложить, имеют один и тот же знак (т. Е. Оба положительные или отрицательные).

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

В симуляторе ниже мы используем 8-битные числа с дополнением до 2. Помните, что наибольшее число, которое мы можем представить, — 127, а наименьшее число — -128, если учитывать, как мы обрабатываем самый левый бит.

Почему такое странное поведение с самым левым битом?

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

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

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

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

С 8 битами, если у нас есть следующее число:

Это означает 127, что является наибольшим числом в нашей строке дополнительного числа до 2 (для 8 бит).

Если мы прибавим 1 к этому числу (и забудем, что это число с дополнением до 2 на секунду), мы получим:

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

После этого прыжка продолжается нормальное поведение добавления 1 с перемещением на один пробел в числовой строке.например:

Представляет -127, что на один пробел от -128.

Отказ от последнего переноса позволяет нам учесть этот скачок на числовой линии.

Мероприятия

Итак, лучший способ научиться этому — практиковать его, и теперь мы заставим вас сделать именно это.

Предположим 8-битные двоичные числа для следующих действий.

.

Представления чисел со знаком — Простая английская Википедия, бесплатная энциклопедия

Представления чисел со знаком

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

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

Sign-and-magnitudeEdit

Sign and Magnitude работает, изменяя самый старший бит (MSB — первая цифра) на 1, если число отрицательное, и уменьшая число на единицу, например:

0000 0010 (2)

станет…

1000 0010 (-2)

Этот метод хранения отрицательных двоичных чисел не работает, потому что:

  • Двоичная арифметика не работает.
  • Сначала мы должны знать, какой механизм хранения использует компилятор того или иного языка.

Дополнение на 1 Редактировать

Дополнение до единиц работает, меняя единицы местами на нули и нули на единицы, например:

0000 0010 (2)

станет …

1111 1101 (-2)

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

Дополнение 2Edit

Дополнение 2 — более сложный способ хранения негативов.Для этого есть три шага:

  1. Найдите положительное двоичное число (например, 8 с основанием 10 = 0000 1000 с основанием 2 ).
  2. Поменяйте местами единицы на нули и нули на единицы (например, 0000 1000 с основанием 2 становится 1111 0111 с основанием 2 ).
    Это известно как «переворачивание битов» или применение логического НЕ к исходному представлению с основанием 2.
  3. Добавьте 1 (например, 1111 0111 основание 2 + 1 основание 2 = 1111 1000 основание 2 ).

Этот метод понравился тем, что:

  • Это как знак и величина; отрицательное число начинается с 1, а положительное — с 0.
  • Двоичная арифметика будет работать.
  • Для 0 есть только одно значение (0000 0000 base 2 ).

.

Представления чисел со знаком — Простая английская Википедия, бесплатная энциклопедия

Представления чисел со знаком

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

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

Знак и величина работает, изменяя старший бит (MSB — первая цифра) на 1, если число отрицательное, и уменьшая его на единицу, например:

0000 0010 (2)

станет …

1000 0010 (-2)

Этот метод хранения отрицательных двоичных чисел не работает, потому что:

  • Двоичная арифметика не работает.
  • Сначала мы должны знать, какой механизм хранения использует компилятор того или иного языка.

Дополнение до единиц работает, меняя единицы местами на нули и нули на единицы, например:

0000 0010 (2)

станет …

1111 1101 (-2)

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

Дополнение 2 — более сложный способ хранения негативов.Для этого есть три шага:

  1. Найдите положительное двоичное число (например, 8 основание 10 = 0000 1000 основание 2 ).
  2. Поменяйте местами 1 на 0 и 0 на 1 (например, 0000 1000 с основанием 2 становится 1111 0111 с основанием 2 ).
    Это известно как «переворачивание битов» или применение логического НЕ к исходному представлению с основанием 2.
  3. Добавьте 1 (например, 1111 0111 основание 2 + 1 основание 2 = 1111 1000 основание 2 ).

Этот метод понравился тем, что:

  • Это как знак и величина; отрицательное число начинается с 1, а положительное — с 0.
  • Двоичная арифметика будет работать.
  • Существует только одно значение для 0 (0000 0000 base 2 ).

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *