"Информатика (в 2-х частях)", Горячев А.В., Герасимова В.Г., Макарина Л.А., Островский С.Л., Паволоцкий А.В., Семёнов А.А., Юдина А.Г., Чернышёва Т.Л.
Компьютер хранит числа в виде последовательностей нулей и единиц, а значение такой последовательности зависит от её длины и способа интерпретации. Беззнаковый код подходит для неотрицательных целых чисел, а знаковый позволяет хранить и положительные, и отрицательные. Для знаковых чисел обычно используют дополнительный код: он помогает выполнять арифметические действия в двоичной системе. Зная число битов, можно определить количество кодов и диапазон значений.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Бит — двоичный разряд, который может иметь значение 0 или 1. Число битов определяет, сколько различных кодов можно составить: каждый новый разряд удваивает их количество. Поэтому по длине кода можно понять, сколько вариантов данных компьютер способен различить.
Беззнаковое целое число — целое число, которое кодируется без знака. Все разряды такого кода участвуют в записи величины, в том числе старший. Этот способ удобен, когда нужно хранить только ноль и положительные значения, например количество предметов.
Знаковое целое число — целое число, для которого предусмотрено представление положительных и отрицательных значений. В дополнительном коде старший разряд помогает определить знак: при 0 число неотрицательное, при 1 — отрицательное. Остальные разряды тоже входят в кодирование числа, поэтому их нельзя просто читать как запись модуля.
Дополнительный код — способ представления знаковых целых чисел, при котором отрицательное число получают инверсией битов его модуля и прибавлением единицы. Инверсия означает замену каждого 0 на 1, а каждой 1 на 0. Такой способ позволяет компьютеру выполнять сложение и вычитание с помощью сходных двоичных операций.
У каждого бита есть два возможных состояния, и выбор в одном разряде не ограничивает выбор в другом. Для двух битов это 2 × 2 = 4 сочетания, для трёх — 2 × 2 × 2 = 8. Поэтому для n битов число вариантов равно 2ⁿ: столько разных значений можно закодировать, если каждому варианту назначить отдельное значение.
В беззнаковом коде все комбинации распределяются по неотрицательным числам, начиная с нуля. Самая маленькая комбинация — набор из одних нулей, а самая большая — из одних единиц. Её значение равно 2ⁿ − 1, поэтому диапазон составляет от 0 до 2ⁿ − 1. Двоичную запись числа помещают в отведённые разряды, добавляя слева нули, если запись короче кода.
Чтобы представить отрицательное число в дополнительном коде, сначала записывают его модуль с заданным количеством разрядов. Затем каждый бит инвертируют и к полученному числу прибавляют единицу. Например, при восьми битах модуль числа 13 записывается как 00001101, после инверсии получается 11110010, а после прибавления единицы — 11110011. Длина записи важна: сначала нужно получить запись модуля именно с нужным числом разрядов.
В знаковом коде n бит позволяют записать 2ⁿ комбинаций, но половина вариантов отводится отрицательным числам, а другая половина — нулю и положительным. Поэтому старший разряд связан со знаком и не может целиком использоваться как ещё один разряд величины. В дополнительном коде диапазон получается от −2ⁿ⁻¹ до 2ⁿ⁻¹ − 1. Положительных чисел на одно больше, чем отрицательных, потому что ноль относится к неотрицательной части диапазона.
Битовая последовательность не содержит отдельной надписи о том, как её понимать: это задаёт тип данных и длина кода. Например, 11111101 при восьми разрядах как беззнаковое число равно 253. Если тот же набор трактовать как знаковый, старший бит показывает отрицательное значение, и результат равен −3. Поэтому перед вычислением нужно выяснить, какой именно тип числа задан.
| Свойство | Беззнаковое число из n бит | Знаковое число из n бит |
|---|---|---|
| Назначение разрядов | Все разряды кодируют величину | Кодируют значение со знаком; старший разряд связан со знаком |
| Минимальное значение | 0 | −2ⁿ⁻¹ |
| Максимальное значение | 2ⁿ − 1 | 2ⁿ⁻¹ − 1 |
| Количество представимых значений | 2ⁿ | 2ⁿ |
| Способ кодирования отрицательных чисел | Не предусмотрен | Дополнительный код |
Пользуйтесь таблицей, чтобы выбрать тип хранения и проверить, поместится ли число в заданное количество битов. Сначала определите, нужны ли отрицательные значения, затем сравните число с границами соответствующего диапазона. Оба варианта дают 2ⁿ кодов, но распределяют их между значениями по-разному.
Задача 1. Записать число 25 в виде беззнакового числа длиной 8 бит. Нужно получить двоичную запись числа, поскольку память хранит код из нулей и единиц. Затем проверим, что в записи ровно восемь разрядов.
Ответ: 25 = 00011001 в беззнаковом восьмибитном коде. Нули слева нужны для установленной длины, а не для изменения величины числа.
Задача 2. Представить число −13 в дополнительном коде длиной 8 бит. При отрицательном числе нельзя просто приписать минус к двоичной записи: нужно применить правило дополнительного кода. Начинаем с модуля числа, то есть с 13.
Ответ: −13 в восьмибитном дополнительном коде записывается как 11110011. Чтобы проверить результат, можно прибавить к нему код числа 13: сумма восьми младших битов даст нули.
Задача 3. Байты 11111101 интерпретировать сначала как беззнаковое, затем как знаковое целое число. В обоих случаях длина кода равна восьми битам, но правила чтения различаются. Поэтому сначала используем все разряды как величину, а затем применим правило дополнительного кода.
Ответ: беззнаковое значение байта — 253, знаковое — −3. Разница возникает не из-за изменения битов, а из-за разных правил интерпретации.
Считать старший разряд знаком и у беззнакового числа — ошибка: в таком коде каждый бит вносит вклад в величину. Её часто допускают, потому что для знакового числа старший разряд действительно связан со знаком. Проверка простая: посмотрите, указан ли тип как беззнаковый, и складывайте веса всех единичных разрядов.
Путать число битов с максимальным значением тоже неверно: n бит дают 2ⁿ вариантов, а не число 2ⁿ. Причина в том, что один из вариантов соответствует нулю, поэтому максимум беззнакового диапазона равен 2ⁿ − 1. Чтобы проверить себя, перечислите значения от 0: их должно быть ровно 2ⁿ.
Иногда отрицательное число получают только инверсией битов модуля. Так не выполняется правило дополнительного кода: после инверсии обязательно нужно прибавить единицу. Проверяйте результат по порядку действий и не пропускайте ни один шаг; например, код −13 в восьми разрядах — 11110011, а не 11110010.
Нельзя считать, что один набор битов всегда означает одно и то же число. Значение зависит от типа интерпретации и длины кода, хотя сами биты могут не меняться. Ошибку можно обнаружить, если явно подписать тип и количество разрядов до вычислений, а затем проверить, попадает ли ответ в соответствующий диапазон.
Для понимания кодирования чисел нужны навыки перевода целых чисел между десятичной и двоичной системами счисления, а также умение определять вес каждого разряда. Эти знания помогают читать двоичные записи и выполнять действия с кодами. Позже тема пригодится при изучении арифметических операций компьютера, переполнения разрядной сетки и типов данных в программах. Переполнение возможно, когда результат выходит за диапазон, который можно записать заданным количеством битов.
Почему при n битах получается именно 2ⁿ комбинаций?
Каждый бит независимо принимает одно из двух значений: 0 или 1. Для двух битов получаются 2 × 2 варианта, для n битов — произведение двух n раз, то есть 2ⁿ комбинаций.
Как определить, сколько бит нужно для хранения числа?
Для беззнакового числа нужно найти наименьшее n, при котором число не превышает 2ⁿ − 1. Для знакового числа проверьте, входит ли оно в диапазон от −2ⁿ⁻¹ до 2ⁿ⁻¹ − 1, и увеличивайте n, пока условие не выполнится.
Почему максимальное беззнаковое число равно 2ⁿ − 1?
Всего n битами можно записать 2ⁿ комбинаций. Одна из них — число 0, поэтому остальные коды соответствуют числам от 1 до 2ⁿ − 1.
Как получить дополнительный код отрицательного числа?
Запишите модуль числа в двоичной системе с нужным количеством битов. Инвертируйте все биты, то есть замените нули на единицы и единицы на нули, затем прибавьте 1.
Почему один и тот же байт может означать разные числа?
Битовая последовательность сама по себе не сообщает, считать ли её беззнаковой или знаковой. Например, 11111101 — это 253 без знака, но −3 в восьмибитном дополнительном коде.
§ 8. Кодирование чисел. Представление чисел (беззнаковых и целых) в памяти компьютера