Информатика · Двоичная арифметикаЗанятие
SilverTests.ru · УчебникДополнительный код
Отрицательные числа в памяти
Дополнительный код и арифметика над ним
0Зачем это нужно
Ячейка памяти — это просто набор битов, нулей и единиц. Знака «+» или «−» в ней нет: всё, что есть, это сама последовательность. Чтобы хранить отрицательные числа, инженеры придумали кодировать знак прямо внутри двоичной записи — так, чтобы сложение и вычитание выполнялись одной и той же схемой процессора. Этот способ называется дополнительный код (англ. two's complement) и применяется во всех современных компьютерах.
1Положительные числа и знаковый бит
В n-битной знаковой ячейке старший бит играет роль знакового: у положительных чисел он равен 0, у отрицательных — 1. Положительное число записывается как обычная двоичная запись с ведущими нулями.
+13 → 0000 1101 ← старший бит = 0
+42 → 0010 1010 ← старший бит = 0
В n битах помещаются числа от −2n−1 до 2n−1−1. Для байта (8 бит) это диапазон от −128 до +127. Отрицательных значений на одно больше, потому что ноль занимает «положительную половину».
2Алгоритм для отрицательных: «инверсия + 1»
Чтобы получить дополнительный код числа −N, нужно:
1. Записать модуль N в двоичной системе с нужным числом разрядов.
2. Инвертировать все биты (0 → 1, 1 → 0). Это обратный код.
3. Прибавить к результату единицу. Это и есть дополнительный код.
Важно. Тот же самый алгоритм работает в обратную сторону. Если в ячейке лежит подозрительная единица в старшем бите — применяешь «инверсия + 1» к этому коду и получаешь модуль исходного отрицательного числа.
3Тренажёр: построй дополнительный код
Тебе будет дано число и разрядность ячейки. Заполни три строки: модуль в двоичном виде, обратный код и дополнительный код. Клик по ячейке переключает её значение между ·, 0 и 1.
Тренажёр · кодирование
Загрузка задачи...
—
Нажми по ячейкам, чтобы заполнить строку.
4Сложение и вычитание
Главная красота дополнительного кода в том, что сложение положительного и отрицательного чисел делается обычным двоичным сложением столбиком. Никаких специальных правил знака не требуется. Если при сложении возникает перенос за пределы старшего разряда — его просто отбрасывают.
Вычитание a − b процессор отдельно даже не реализует: он сначала строит дополнительный код для b (то есть −b), а потом складывает a + (−b). Одна схема — обе операции.
20: 0001 0100
−13: 1111 0011
─────────────
1 0000 0111 ← перенос отбрасывается
─────────────
0000 0111 = +7
Старший бит результата равен 0 → число положительное, читается напрямую как 7. Сходится с обычным «20 − 13 = 7».
5Тренажёр: сложение в дополнительном коде
Тебе будут даны два числа и разрядность. Заполни строку за строкой: представление A, представление B, и результат сложения (без переноса за пределы байта). Если число отрицательное — не забудь применить «инверсия + 1».
Тренажёр · сложение
Загрузка задачи...
—
Нажми по ячейкам, чтобы заполнить строку.
6Шпаргалка
Кодирование −N в n битах
1) записать |N| в двоичной системе (n разрядов)
2) инвертировать все биты ← обратный код
3) прибавить 1 ← дополнительный код
Сложение a + b
1) представить оба числа в дополнительном коде
2) сложить как обычные двоичные числа столбиком
3) перенос за пределы старшего разряда — отбросить
4) старший бит результата = знак (0 плюс, 1 минус)
Декодирование
старший бит = 0 → читать как обычное двоичное
старший бит = 1 → применить «инверсия + 1», получить модуль
Если знаки слагаемых одинаковы, а знак результата получился другой — это переполнение: ответ не помещается в выбранную разрядность. Это тема следующего занятия.