Как перевести отрицательное число в двоичную систему
Перейти к содержимому

Как перевести отрицательное число в двоичную систему

  • автор:

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

Прямой код – это представление числа в двоичной системе счисления, при котором первый (старший) разряд отводится под знак числа. Если число положительное, то в левый разряд записывается 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

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

  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

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

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

Например, нужно перевести число 81010 в двоичную систему:

Результат записываем в обратном порядке снизу вверх. Получается 81010 = 11001010102

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

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

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

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

2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 2 10
2 4 8 16 32 64 128 256 512 1024

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

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

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0 1 2 3 4 5 6 7 8 9 A B C D E F

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

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

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

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

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

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

2 9 = 1000000000 (1 и девять нулей) +
2 8 = 100000000 (1 и восемь нулей) +
2 5 = 100000 (1 и пять нулей) +
2 3 = 1000 (1 и три нуля) +
2 1 = 10 (1 и один ноль)

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

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

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

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

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

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

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

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

5478= 101 100 111
5 4 7

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

7D6A16= (0)111 1101 0110 1010
7 D 6 A

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

  • Авторские методические материалы
  • Задачи по математике
  • Задачи по физике
  • Биология
  • Подготовка к ЕГЭ
  • Задачи по химии
  • Астрономия
  • Статьи об образовании
  • История науки

Как перевести десятичное отрицательное число в двоичное?

Как это реализовать ?
С положительными все понятно, а что делать с отрицательными не знаю.
Смог только получить обратный код числа ,а вот последний шаг сложение 1 привел меня в тупик.
Видел реализации на PASCAL и C , мне нужно на JAVA

  • Вопрос задан более трёх лет назад
  • 25477 просмотров

2 комментария

Оценить 2 комментария

С этим на фрилансим.ру или к Скуратову.
Иван Грозный @warriorkg Автор вопроса
AVKor: Программу уже написал
Решения вопроса 0
Ответы на вопрос 4

Ivanq

Знаю php, js, html, css

Дано: -128
1. Отрицательное число делаете положительным
-128 => 128 (10000000)
2. Отрицаете все биты
128 (10000000) => 127 (01111111)
3. Прибавляете 1 к получившемуся числу
127 (01111111) => -128 (10000000)

Ответ написан более трёх лет назад
Нравится 2 17 комментариев
Иван Грозный @warriorkg Автор вопроса

В 3 пункте застрял. Ну и как это сделать ? Это не десятичные числа и к ним нет оператора + , которая бы сложила двоичные числа правильно.!

Ivanq

Иван Грозный: берете 127 из предудушего пункта и прибавляете 1 десятично получится 128. Но при переводе в двоичную систему получится -128! Только во 2 пункте нужно либо делать XOR 11111111 если число должно быть одно-байтовым и XOR 1111111111111111 если число должно быть дву-байтовым

stasuss

Ivanq: ему готовый оператор надо походу. волшебный. который ему сложит массивы (или как он там представляет числа бинарные). обленились уже все)))

Ivanq

Curly Brace: да. код нормальный сам писать никто не хочет. зачем тогда тостер создали? )
Иван Грозный @warriorkg Автор вопроса

Ivanq: Curly Brace: Я написал программу. По следующему алгоритму :
1. Ввод числа (отр.)
2. Переводим в положительный ( получаем модуль )
3. Минус 1 от полученного числа
4. Перевод в двоичный вид
5. Инвертирование
И мне не понадобилось ни волшебная палочка, ни сдвиги.

Ivanq

Иван Грозный: Только это не работает для положительных чисел

stasuss

это хак называется

Ivanq

Ivanq

Curly Brace: это не хак, так везде делают. команда neg в ассемблере именно так и работает
Иван Грозный @warriorkg Автор вопроса
Ivanq: Мне и не нужно было для положительных чисел

Ivanq

Иван Грозный: только проверку в коде сделайте! на положительные числа и не числа вообще
Иван Грозный @warriorkg Автор вопроса

Ivanq

Иван Грозный: молодцы! подрастающее поколение! сам не может додуматься для элементарной вещи!
Иван Грозный @warriorkg Автор вопроса
Ivanq: Я как бы сам додумался
Иван Грозный @warriorkg Автор вопроса
Ivanq: Когда писал сделал , я имел ввиду, что уже сделал, а не после того как ты сказал

Ivanq

Ivanq

stasuss

быдлокодер со стажем
а чо там? инвертируешь все биты и прибавляешь к этому числу единицу. так работает «two compliment»
Ответ написан более трёх лет назад
Нравится 1 8 комментариев
Иван Грозный @warriorkg Автор вопроса
Будьте добры! Напишите код для сложения «ДВОИЧНЫХ ЧИСЕЛ В JAVA».

stasuss

Иван Грозный: я не пишу на java) да и вообще не культурно просить написать кого то код. что именно делать надо понятно же, а имплементация это уже важно в первую очередь тебе.

Иван Грозный @warriorkg Автор вопроса

Curly Brace: Тогда не надо умничать, если не знаете ответа. Я знаю, что нужно в конце прибавить 00000001 в случае с 5 — кой. Ну и как это сделать ? Это не десятичные числа и к ним нет оператора + , которая бы сложила двоичные числа правильно.!

stasuss

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

stasuss

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

СРОСОБЫ ПРЕДСТАВЛЕНИЯ ОТРИЦАТЕЛЬНЫХ ЧИСЕЛ. ДОПОЛНИТЕЛЬНЫЙ КОД

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

Пусть требуется перевести восьмеричное число 24738 в двоичное число. Воспользовавшись Таблицей соответствия из Приложения, получим:

поскольку 28 = 0102, 48 = 1002, 78 = 1112. Следует помнить, что восьмеричное число кодируется тремя битами, и выписывать триады нужно полностью. Исключением из этого правила может служить только старшая триада, в которой старший бит (СБ) равен нулю.

24738 = 101001110112 = 0101 0011 10112 = 53B16

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

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