"Информатика (базовый и углублённый уровень)", Гейн А.Г., Сенокосов А.И.
Целое число в компьютере хранится не само по себе, а в виде двоичного кода фиксированной длины. От числа выделенных битов зависят количество возможных комбинаций и диапазон значений. Для отрицательных чисел применяют прямой, обратный и особенно дополнительный код: последний позволяет складывать положительные и отрицательные числа одной операцией. При этом результат может измениться из-за переполнения.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Разрядная сетка — фиксированное количество битов, отведённое для хранения целого числа. Если выделено n битов, возможны 2ⁿ различных комбинаций. Поэтому разрядная сетка заранее ограничивает диапазон значений.
Прямой код — запись, в которой старший разряд хранит знак, а остальные разряды — модуль числа, то есть его значение без знака. Для положительного числа старший бит равен 0, для отрицательного — 1. Такой способ нагляден, но неудобен для автоматического сложения.
Обратный код отрицательного числа получают инвертированием всех разрядов положительного кода, кроме знакового. Нули заменяются единицами, а единицы — нулями. Этот код подготовил идею арифметики без отдельной обработки знака, но имеет два варианта нуля.
Дополнительный код отрицательного числа получают из его положительного кода: сначала инвертируют биты, затем прибавляют единицу. Именно этот вариант обычно используется для хранения знаковых целых чисел. Он позволяет складывать коды по обычным правилам двоичного сложения.
Количество битов ограничивает диапазон потому, что каждый бит может иметь только два состояния: 0 или 1. Для n битов число комбинаций равно 2ⁿ, а каждая комбинация может соответствовать только одному коду. Часть кодов в знаковой системе занимает отрицательные числа, поэтому диапазон определяется не только количеством комбинаций, но и выбранным способом кодирования.
Положительное число записывают в двоичной системе и дополняют слева нулями до длины сетки. Для отрицательного числа прямой код хранит знак отдельно, а обратный и дополнительный используют преобразование битов. В дополнительном коде единица после инверсии нужна, чтобы последовательность кодов переходила к следующему значению без отдельного представления знака.
В дополнительном коде старший разряд выполняет двойную роль: он показывает знак, а при вычислении участвует как разряд с отрицательным весом −2ⁿ⁻¹. Остальные разряды имеют обычные положительные веса. Поэтому сложение кодов можно проводить одной схемой независимо от знаков операндов, а перенос из старшего разряда просто не сохранять.
Перевод числа начинают с последовательного деления положительного модуля на 2 и записи остатков в обратном порядке. Затем запись дополняют нулями до нужной длины и при необходимости формируют дополнительный код. При обратном декодировании старший бит 0 означает обычный положительный код, а старший бит 1 требует инверсии, прибавления единицы и постановки знака минус.
| Характеристика | Прямой код | Обратный код | Дополнительный код |
|---|---|---|---|
| Способ представления положительного числа | Знак 0 и двоичный модуль | Совпадает с прямым кодом | Совпадает с прямым кодом |
| Способ представления отрицательного числа | Знак 1 и двоичный модуль | Инверсия разрядов модуля | Инверсия разрядов и прибавление 1 |
| Роль старшего разряда | Только знак | Знак, остальные разряды инвертированы | Знак и отрицательный вес −2ⁿ⁻¹ |
| Наличие двух нулей | Есть: +0 и −0 | Есть: +0 и −0 | Нет, ноль один |
| Выполнение сложения | Нужна отдельная обработка знаков | Возможна коррекция переноса | Обычное двоичное сложение |
| Диапазон при фиксированном числе разрядов | −(2ⁿ⁻¹ − 1) … 2ⁿ⁻¹ − 1 | −(2ⁿ⁻¹ − 1) … 2ⁿ⁻¹ − 1 | −2ⁿ⁻¹ … 2ⁿ⁻¹ − 1 |
| Основное применение в компьютерной арифметике | Наглядное представление | Исторические и учебные системы | Современное хранение знаковых целых |
Таблицу удобно использовать как памятку: сначала определите длину сетки и знак числа, затем выберите правило формирования кода. Для вычислений особенно важен последний столбец, поскольку дополнительный код совпадает с принципом работы большинства процессоров. При сравнении диапазонов учитывайте, что в дополнительном коде есть отдельный код для −2ⁿ⁻¹.
Нужно представить 37 в двоичной системе и получить его коды во всех трёх вариантах. Число положительное, поэтому его старший разряд должен быть равен 0. Для положительного числа прямой, обратный и дополнительный коды совпадают.
Ответ: 37₁₀ = 00100101₂; во всех трёх кодах запись одинакова.
Нужно получить восьмиразрядный дополнительный код отрицательного числа, а затем расшифровать его. Сначала работаем с модулем 37, потому что код отрицательного числа строится на основе положительной записи. После этого проверим результат обратным преобразованием.
Ответ: −37 представляется кодом 11011011, а код 11011011 декодируется как −37.
Выполним вычисление в восьмиразрядной сетке и проверим переполнение. Диапазон восьмиразрядного дополнительного кода равен −128 … 127. Математический результат заранее равен −42, он входит в этот диапазон, поэтому переполнения ожидать не следует.
Ответ: −85 + 43 = −42, код результата 11010110. Переполнения нет, потому что результат находится в диапазоне −128 … 127.
Путают старший разряд с обычным разрядом модуля. В знаковом коде его значение нельзя просто прибавить как положительную степень двойки. Проверяйте сначала знак, а для дополнительного кода учитывайте отрицательный вес старшего бита.
Забывают прибавить единицу после инверсии. Простая инверсия даёт обратный, а не дополнительный код. Самопроверка проста: после инверсии обязательно выполните ещё один шаг — прибавление 1.
Используют коды разной длины. Тогда знаковый бит оказывается не на своём месте, и результат уже относится к другой разрядной сетке. Перед вычислением дополняйте все записи слева до одинакового числа разрядов.
Считают любой внешний перенос переполнением. Перенос за границу сетки отбрасывают, а переполнение определяют сравнением результата с допустимым диапазоном. При сложении чисел разных знаков внешний перенос сам по себе обычно не свидетельствует о переполнении.
Для работы с кодами нужны перевод между десятичной и двоичной системами, двоичное сложение и умение инвертировать биты. Без этих действий нельзя надёжно сформировать или расшифровать дополнительный код.
Тема объясняет устройство целочисленных типов данных, работу процессора и машинных команд. Она показывает, почему компьютерная арифметика отличается от вычислений с неограниченными математическими числами.
Представление чисел связано с логическими операциями, адресацией памяти и анализом переполнений в программах. Те же операции с битами используются при маскировании и проверке отдельных разрядов.
Почему отрицательные числа обычно хранят в дополнительном коде, а не в прямом?
В дополнительном коде сложение положительных и отрицательных чисел выполняется одной и той же двоичной операцией. Не нужны отдельные правила для работы со знаком и модулем, поэтому схема процессора получается проще.
Почему при получении дополнительного кода нужно прибавлять именно единицу?
Инвертирование битов даёт обратный код, а прибавление единицы превращает его в дополнительный. Благодаря этому код отрицательного числа имеет правильное двоичное значение при сложении и единственное представление нуля.
Как определить десятичное значение двоичного кода со старшим битом 1?
В дополнительном коде такой старший бит обычно означает отрицательное число. Инвертируйте все биты, прибавьте единицу, переведите полученную величину в десятичную систему и поставьте знак минус.
Всегда ли перенос за пределы разрядной сетки означает переполнение?
Нет. Перенос за пределы сетки просто отбрасывают. Переполнение есть только тогда, когда математический результат не входит в диапазон знаковых чисел данной длины.
Почему результат сложения двух допустимых чисел может оказаться неправильным?
Компьютер работает с ограниченным числом разрядов, поэтому истинный результат может выйти за допустимый диапазон. После отбрасывания лишнего переноса оставшийся код будет обозначать другое число.
Лабораторная работа № 5 (к § 23) Представление целых чисел в памяти компьютера. Особенности компьютерной арифметики