"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.
Компьютер хранит целое число как последовательность битов фиксированной длины. Такая длина определяет, сколько памяти займёт число и какие значения можно записать. Неотрицательные числа кодируют обычной двоичной записью, а отрицательные — дополнительным кодом: биты модуля инвертируют и прибавляют единицу. Этот способ позволяет складывать числа разных знаков обычным двоичным сложением. Если результат не помещается в заданное число разрядов, возникает переполнение.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Бит — минимальная единица хранения информации, которая принимает значение 0 или 1. Последовательность битов служит кодом числа, а выделенное под него число битов задаёт длину записи. Поэтому один и тот же числовой формат всегда занимает определённое место в памяти.
Разрядная сетка — фиксированное количество битов, отведённое для записи числа. Её старший разряд — крайний слева — участвует в определении знака числа в дополнительном коде. Зная число разрядов, можно определить и объём памяти, и границы допустимых значений.
Дополнительный код — способ представления целого числа, при котором отрицательное число кодируют инвертированием двоичной записи его модуля и прибавлением единицы. Модуль — это величина числа без знака, например модуль −13 равен 13. Такой код нужен, чтобы компьютер мог выполнять сложение чисел разных знаков по общим двоичным правилам.
Переполнение — ситуация, когда результат вычисления выходит за диапазон чисел, представимых в данной разрядной сетке. Например, при ограничении от −128 до 127 результат 150 уже не помещается. Понимание переполнения помогает объяснить, почему значение в программе иногда отличается от обычного математического результата.
Количество бит фиксируют заранее, потому что память компьютера организована как набор ячеек определённого размера, а программе нужно знать, сколько места занимает значение. При фиксированной длине каждой позиции соответствует конкретный разряд, поэтому операции можно выполнять над одинаковыми по размеру кодами. Но конечное число битов означает конечное число возможных комбинаций: увеличить диапазон без увеличения разрядности нельзя.
Неотрицательное число записывают обычным двоичным кодом, а свободные позиции слева заполняют нулями. Нули не меняют величину числа, зато запись становится равной длине разрядной сетки. Например, двоичное число 1101 в восьми разрядах выглядит как 00001101. Благодаря одинаковой длине коды можно хранить и обрабатывать в одном формате.
Чтобы получить дополнительный код отрицательного числа, сначала записывают его модуль в двоичной системе на заданном количестве разрядов. Затем каждый 0 заменяют на 1, а каждый 1 — на 0, после чего к полученному коду прибавляют единицу. Эти действия задают код отрицательного числа именно для выбранной разрядной сетки, поэтому при смене её длины запись может измениться.
Дополнительный код удобен для арифметики, потому что сложение чисел с разными знаками сводится к обычному двоичному сложению их кодов. Компьютеру не требуется отдельно сравнивать модули и выбирать особое правило для каждого сочетания знаков. Если результат помещается в разрядную сетку, его биты уже представляют ответ в том же формате; перенос за пределы сетки отбрасывают.
В n-разрядном дополнительном коде старший разряд отводится под знак, поэтому диапазон равен от −2^(n−1) до 2^(n−1)−1. Отрицательных значений на одно больше, чем неотрицательных, потому что код нуля входит в неотрицательную часть. Проверяя результат операции, нужно сравнить его с обеими границами: если он меньше нижней или больше верхней, происходит переполнение и представление не соответствует математическому ответу.
Сначала найдите в таблице число разрядов и соответствующие ему границы: без этого нельзя решить, поместится ли значение в формате. Для кодирования положительного числа используйте двоичную запись с нулями слева, а для отрицательного выполните инверсию и прибавление единицы. Последние строки показывают, как эти правила применяются к нулю и паре чисел 13 и −13.
| Что рассматриваем | Правило или результат |
|---|---|
| Количество разрядов | Задаётся заранее; все числа в формате занимают одинаковое число битов n. |
| Диапазон значений для n разрядов | От −2^(n−1) до 2^(n−1)−1. |
| Запись неотрицательного числа | Обычный двоичный код дополняют нулями слева до n разрядов. |
| Получение кода отрицательного числа | Записывают модуль на n разрядах, инвертируют биты и прибавляют единицу. |
| Код нуля | 000…000; у нуля одна запись. |
| Пример: 13 и −13 в 8 разрядах | 13: 00001101; −13: 11110011. |
Задача 1. Записать число 13 в виде восьмиразрядного двоичного кода.
Ответ: 13 в восьми разрядах записывается как 00001101.
Задача 2. Получить восьмиразрядный дополнительный код числа −13.
Ответ: дополнительный код числа −13 — 11110011. Порядок действий важен: если ограничиться инверсией, получится другой код.
Задача 3. Для восьмиразрядных целых чисел проверить, представим ли результат 100 + 50, и объяснить полученный результат при вычислении в этом формате.
Ответ: 150 не помещается в диапазон от −128 до 127; вычисление в восьми разрядах приводит к переполнению и некорректному для исходного формата результату.
Ошибка — считать, что старший бит сам по себе показывает модуль числа или что оставшиеся биты можно прочитать как обычное двоичное число. Так рассуждают, перенося на дополнительный код привычную запись числа со знаком. Проверяйте отрицательный код по правилу инверсии и прибавления единицы либо складывайте его с кодом противоположного числа: сумма должна дать нулевой код с учётом разрядности.
Ошибка — после инверсии битов забыть прибавить единицу. Это происходит, когда первое действие принимают за весь алгоритм. Чтобы проверить запись, пройдите обе операции и убедитесь, что к инвертированному коду действительно добавлена единица; например, −13 в восьми разрядах — 11110011, а не 11110010.
Ошибка — записывать число, не учитывая заданную разрядность. Короткая двоичная запись может показывать величину, но не является кодом нужной длины и не позволяет верно проверить допустимый диапазон. Сначала установите n, затем дополните запись нулями или выполните преобразование кода на n разрядах.
Ошибка — ожидать, что при переполнении компьютер автоматически добавит разряд или сохранит правильный математический ответ. Такое ожидание возникает из обычной арифметики, где длина записи не ограничена. Проверяйте результат сравнением с границами формата; если он выходит за них, нужно признать переполнение, а не считать сохранённые биты точным ответом.
Для работы с дополнительным кодом нужно уметь переводить целые числа из десятичной системы счисления в двоичную и обратно. Это знание помогает получить записи модулей, а также прочитать результат, хранящийся в битах. Двоичное сложение и вычитание объясняют, почему дополнительный код упрощает арифметические операции. В программировании эта тема нужна для понимания целочисленных типов данных и ограничений разрядности компьютерных устройств.
Почему для хранения целого числа заранее задают количество бит?
Фиксированная длина позволяет заранее выделить под число определённый объём памяти и одинаково обрабатывать значения. Она же задаёт границы диапазона: число за этими границами нельзя корректно представить в выбранном формате.
Как из двоичной записи положительного числа получить код отрицательного?
Запишите модуль числа в двоичном виде на нужном количестве разрядов, дополнив слева нулями. Затем инвертируйте все биты и прибавьте к полученной записи единицу.
Зачем после инвертирования битов прибавлять единицу?
Инверсия сама по себе не даёт представление, при котором сложение работает для чисел разных знаков как обычное двоичное сложение. Прибавление единицы завершает получение дополнительного кода и обеспечивает нужное поведение арифметики.
Как найти диапазон чисел, которые помещаются в заданное количество разрядов?
Для n разрядов в дополнительном коде нижняя граница равна −2^(n−1), а верхняя — 2^(n−1)−1. Например, при n = 8 получаем диапазон от −128 до 127.
Что происходит, если результат арифметической операции выходит за этот диапазон?
Возникает переполнение: результат в заданном формате не соответствует математическому результату. Разрядность сама собой не увеличивается, поэтому записанные биты могут означать другое число.
§ 27. Хранение в памяти целых чисел