Статья Автор: Деникина Н.В., Деникин А.В.

Двоичная арифметика

Информатика · Двоичная арифметикаЗанятие
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», получить модуль

Если знаки слагаемых одинаковы, а знак результата получился другой — это переполнение: ответ не помещается в выбранную разрядность. Это тема следующего занятия.

© SilverTests.ru · Информатика · 10 класс
Печать