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

калькулятор систем счисления

Как пользоваться этим калькулятором:

  1. Поле «Десятичное число»: Введите любое целое число (например, -13 или 42).
  2. Разрядность: Выберите 8, 16 или 32 бита. Это критически важно, так как представление числа зависит от размера ячейки памяти.
  3. Кнопка «Рассчитать»: Программа мгновенно вычислит три вида кодов.
  4. Блок «Ход решения»: Здесь вы увидите текстовое пояснение того, как именно компьютер превратил ваше число в нули и единицы.

Основные фишки реализации:

Группировка бит: Длинные последовательности (вроде 32 бит) автоматически разбиваются на блоки по 4 цифры для удобства чтения.

Валидация: Если вы попытаетесь ввести число -200 для 8-битной сетки, калькулятор вежливо сообщит, что оно не поместится (так как диапазон 8 бит со знаком — от -128 до 127).

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

Двоичный калькулятор

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

Зачем это вообще нужно знать?

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

Зачем учить эти коды:

  1. Унификация операций: Благодаря дополнительному коду процессор вообще не умеет вычитать. Он просто складывает положительное число с «хитрым» отрицательным. Результат получается верным!
  2. Проблема «двух нулей»: В простом (прямом) коде у нас получается два нуля:  +0  и 0 . Это путает логику. Дополнительный код решает эту проблему — ноль там только один.
  3. Понимание ошибок (Overflow): Когда в игре у персонажа внезапно становится «-2 147 483 648» здоровья после получения бонуса — это знание поможет тебе понять, что произошло переполнение разрядной сетки.

Краткая теория

В памяти компьютера всё ограничено «ячейками» (разрядами). Обычно это 8, 16, 32 или 64 бита. Самый левый бит — знаковый (0 — плюс, 1 — минус).

1. Прямой код

Это число «как оно есть» в двоичной системе, но с установленным знаковым битом.

Пример для -5 (в 8 битах):

5 в двоичной: 0000 0101

Меняем первый бит на 1: 1000 0101

2. Обратный код (Ones’ Complement)

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

Для -5:

Берем 0000 0101 (это +5)

Переворачиваем всё: 1111 1010

3. Дополнительный код (Two’s Complement)

Именно этот код «живет» в твоем компьютере.

Алгоритм: Обратный код + 1.

Для -5:

  • Обратный: 1111 1010
  • +1: 1111 1011

Шпаргалка: Как быстро перевести отрицательное число

Если тебе нужно быстро посчитать это на контрольной, используй это правило:

«Справа налево до первой единицы»

Запиши положительное число (например, 5 = 0000 0101).

Иди справа налево: оставляй все нули и первую встреченную единицу без изменений.

Все биты после (левее) первой единицы — инвертируй.

Было: 0000 0101 (дошли до первой единицы)

Стало: 1111 1011 (инвертировали всё, что левее) — это и есть доп. код!

Задание для самопроверки: Попробуй перевести число -10 в 8-битную сетку. Если получится 1111 0110 — ты усвоил тему!

Отлично! Давай поступим так: сначала разберем «ловушку», на которой сыплются многие ученики, а затем я дам тебе небольшой тест, чтобы закрепить материал.


Сложный пример: число -128 в 8 битах

Это самый коварный пример в теме. Почему? Потому что число +128 не влезает в 8-битную знаковую сетку (максимум там +127).

Как же компьютер получает -128?

Возьмем число -127:

  • +127 в двоичной: 0111 1111
  • Инвертируем: 1000 0000
  • Добавляем 1: 1000 0001 (это -127)

Вычтем еще единицу (или прибавим -1):

  • Если мы из 1000 0001 вычтем 1, получим 1000 0000.

Итог: В 8-битной системе 1000 0000 — это и есть -128. У этого числа нет положительной пары в этой же разрядности. Это «лишнее» отрицательное число, которое появилось благодаря тому, что мы избавились от второго нуля.

Уточнение про второй нуль

Это тот самый момент, где информатика превращается в магию чисел. Давай разберемся, куда делся «второй нуль» и почему это важно.

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

1. Проблема «двух нулей» в прямом коде

В прямом коде первый бит — это просто «минус», а остальные — само число.

  • Как записать +0? Это 0000 0000.
  • Как записать -0? Мы просто меняем первый бит на 1: 1000 0000.

Математически +0 и -0 — это одно и то же. Но для компьютера это две разные комбинации битов.

Это была огромная проблема для первых программистов: процессору приходилось каждый раз делать двойную проверку: «Результат равен 00000000? А может он равен 10000000?». Это замедляло вычисления.

2. Как дополнительный код «схлопнул» нули

Когда придумали дополнительный код, нуль стал уникальным. Давай проверим это по алгоритму (инверсия + 1):

  1. Возьмем +0: 0000 0000.
  2. Инвертируем его (обратный код): 1111 1111.
  3. Прибавим единицу: 1111 1111 + 1 = 1 0000 0000.
  4. В 8-битной сетке лишняя единица слева просто «вылетает» (отбрасывается).
  5. Итог: Мы снова получили 0000 0000.

Теперь и для положительного, и для отрицательного нуля комбинация одна — только нули.

3. Откуда взялось число -128?

У нас в 8 битах всего 256 возможных комбинаций (от 0000 0000 до 1111 1111).

  • Раньше (в прямом коде) одна комбинация тратилась на +0, а еще одна — на -0.
  • Теперь нуль занимает только одну комбинацию (0000 0000).
  • Значит, одна комбинация освободилась!

Эту «лишнюю» комбинацию, которая раньше была отрицательным нулем (1000 0000), математики решили отдать отрицательным числам. Так диапазон стал асимметричным:

  • Положительные: от 1 до 127 (всего 127 чисел).
  • Ноль: 1 штука.
  • Отрицательные: от -1 до -128 (всего 128 чисел).

Резюме для ученика:

В памяти компьютера нет знака «минус», есть только ячейки. Чтобы не путаться с двумя разными нулями и сделать арифметику проще, программисты договорились использовать дополнительный код. Это позволило:

  1. Иметь только один единственный нуль.
  2. Использовать освободившееся место для еще одного числа — -128.

Именно поэтому, если ты в языке программирования (например, C++ или Java) попробуешь прибавить 1 к самому большому числу 127 (тип byte), ты внезапно «провалишься» в -128. Это и есть переполнение!

Теперь стало понятнее, почему диапазон «кривой» и откуда там лишнее число?

.

Мини-тест для самопроверки

Попробуй ответить на эти вопросы (ответы я спрятал ниже, не подглядывай сразу!).

Вопрос 1. Какое максимальное положительное число можно записать в 8-битную ячейку памяти (тип signed char)?

А) 255

Б) 127

В) 128

Вопрос 2. Как будет выглядеть число -1 в дополнительном коде (8 бит)?

Подсказка: Возьми +1 (0000 0001), инвертируй и прибавь 1.

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

А) Числа занимают меньше места.

Б) Сложение и вычитание можно выполнять на одном и том же устройстве (сумматоре).

В) Его легче читать человеку.


Ответы

Ответы

  1. Б) 127. Первый бит зарезервирован под знак, остается 7 бит: 27 — 1 = 127.
  2. 1111 1111. Это «король» отрицательных чисел в программировании. Если видишь все единицы в знаковом типе — это всегда -1.
  3. Б) Унификация операций. Процессору не нужно отдельное устройство для вычитания.


Твое домашнее задание (по желанию):

Попробуй перевести число -20 в 8-битную сетку (дополнительный код), используя мой «быстрый способ» (справа налево до первой единицы).

Напиши, что у тебя получилось, и я скажу, правильно ли ты решил!

Рейтинг
( 1 оценка, среднее 5 из 5 )
Инфоучка
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: