"Информатика (базовый уровень)", Семакин И.Г., Хеннер Е.К., Шеина Т.Ю.
Компьютер хранит числа не в привычной десятичной записи, а как последовательности двоичных разрядов — нулей и единиц. Число разрядов и выбранный способ кодирования определяют, какие значения можно записать и насколько точно. Целые числа обычно хранят со знаком, отрицательные — в дополнительном коде, а дробные — с фиксированной или плавающей точкой. Ограниченная разрядность может привести к переполнению или округлению.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Разрядная сетка — фиксированное количество двоичных разрядов, отведённых компьютером для хранения числа. Каждый разряд хранит 0 или 1, а его позиция задаёт вклад в значение числа. Сетка нужна, чтобы определить размер записи и заранее знать, какие значения в ней помещаются.
Представление числа с фиксированной точкой — способ хранения, при котором положение десятичной или двоичной точки заранее задано. Часть разрядов отводится под целую часть, а часть — под дробную. Такой способ удобен, когда формат и требуемая точность известны заранее.
Представление числа с плавающей точкой — запись числа в виде произведения мантиссы и степени основания системы счисления. Мантисса содержит значащие цифры, а порядок задаёт, насколько сдвинута точка. Такое разделение помогает хранить числа сильно различающихся величин в одном формате.
Дополнительный код — способ представления отрицательных целых чисел, удобный для выполнения сложения и вычитания в компьютере. Чтобы получить его для отрицательного числа, инвертируют разряды записи его модуля и прибавляют единицу. Благодаря этому отрицательные и положительные числа можно складывать одной двоичной схемой.
Компьютер хранит числа в двоичной системе, потому что электронным схемам проще надёжно различать два состояния: например, наличие и отсутствие сигнала. Эти состояния кодируют цифрами 1 и 0, а арифметические операции выполняют над последовательностями таких цифр. Значение каждой позиции определяется степенью двойки, поэтому запись можно перевести в привычную десятичную систему. Например, 1101₂ означает 1 × 2³ + 1 × 2² + 0 × 2¹ + 1 × 2⁰, то есть 13.
Количество разрядов ограничивает число различных комбинаций, а значит, и диапазон хранимых целых. В n-разрядной беззнаковой сетке помещаются значения от 0 до 2ⁿ − 1, потому что всего существует 2ⁿ комбинаций. Если результат выходит за пределы диапазона, возникает переполнение: в сетке остаётся только ограниченное число разрядов, и полученная запись уже не соответствует ожидаемому значению. Поэтому до вычисления полезно проверять, помещаются ли возможные результаты в выбранный формат.
Для положительного целого в знаковом формате обычно используют старший разряд как знак: 0 означает плюс, а оставшиеся позиции хранят величину. Отрицательное число часто записывают дополнительным кодом, чтобы арифметике не требовались отдельные правила для вычитания. Для n разрядов знаковый диапазон равен от −2ⁿ⁻¹ до 2ⁿ⁻¹ − 1, поскольку одна комбинация отведена на знак и распределение отрицательных значений несимметрично. Например, в восьми разрядах можно представить числа от −128 до 127.
При фиксированной точке положение разделителя не меняется: заранее решено, сколько разрядов обозначает целую часть и сколько — дробную. Поэтому такой формат позволяет хранить дроби, но число возможных значений ограничено как разрядностью, так и выбранным положением точки. Если выделить больше разрядов дробной части, шаг между соседними значениями станет меньше, зато может уменьшиться диапазон целой части. Формат приходится подбирать под задачу.
Плавающая точка хранит мантиссу и порядок, поэтому точку можно условно перемещать, изменяя степень основания. Большой по модулю порядок позволяет записывать очень большие числа, а малый — очень малые, не выделяя каждому числу отдельную сетку. Однако число разрядов мантиссы конечно: если значащих цифр больше, чем помещается, лишние цифры округляют. Поэтому диапазон может быть широким, но представление многих значений остаётся приближённым.
| Свойство | Целые числа | Числа с фиксированной точкой | Числа с плавающей точкой |
|---|---|---|---|
| Что хранится в разрядах | Цифры двоичного числа и, при необходимости, знак | Цифры числа при заранее заданном положении точки | Мантисса, порядок и знак |
| Диапазон представимых значений | Ограничен числом разрядов и способом кодирования | Ограничен разрядностью и положением точки | Широкий, зависит от диапазона порядка |
| Точность представления | Целые числа в допустимом диапазоне представляются точно | Зависит от числа дробных разрядов | Зависит прежде всего от разрядности мантиссы |
| Основная причина ограничения | Конечное количество разрядов | Конечное количество разрядов и фиксированная точка | Конечное количество разрядов мантиссы и порядка |
| Типичная проблема при вычислениях | Переполнение диапазона | Переполнение или потеря части дробной точности | Погрешность округления |
Сначала выберите строку со свойством, которое важно для задачи: например, диапазон или точность. Затем сравните столбцы и оцените, какой формат подходит лучше. Таблица показывает общие свойства; конкретные пределы зависят от числа выделенных разрядов.
Нужно найти, какие степени двойки дают в сумме 13, а затем разместить соответствующие цифры по позициям. Восьмиразрядная сетка требует ровно восемь двоичных цифр. Если значащих цифр меньше, слева добавляют нули: значение числа от этого не меняется.
Ответ: 13₁₀ = 00001101₂ в восьмиразрядной сетке. Проверка: 8 + 4 + 1 = 13. Нули слева занимают свободные позиции и не меняют значение.
Сначала строят положительную запись модуля числа 13, сохраняя восемь разрядов. Затем каждый ноль заменяют единицей, а каждую единицу — нулём; это инверсия разрядов. Последний шаг — прибавить единицу, не выходя за пределы восьмиразрядной сетки.
Ответ: −13 в восьмиразрядном дополнительном коде — 11110011. Проверить знак можно по старшему разряду: единица указывает на отрицательное число в этом формате. Если повторить инверсию и прибавление единицы, получится модуль 13.
Запись дана в двоичной системе: переносить точку нужно между двоичными разрядами, а масштабировать число — степенями двойки. В нормализованной форме мантиссу записывают так, чтобы перед точкой стояла одна значащая цифра. При переносе точки влево значение мантиссы увеличивается относительно исходной записи, поэтому порядок должен компенсировать этот перенос.
Ответ: 0,001011₂ = 0,1011₂ × 2⁻²; мантисса — 0,1011₂, порядок — −2. Проверка: сдвиг точки в мантиссе на две позиции влево с учётом множителя 2⁻² возвращает исходное число. Для приведённой записи округление не требуется, но в более коротком формате оно возможно.
Считать, что увеличение числа разрядов меняет только внешний вид записи, — неверно: при том же способе кодирования оно расширяет диапазон, а для дробей обычно позволяет повысить точность. Так думают, потому что добавленные нули в привычной записи иногда не меняют число. Проверьте себя: посчитайте число возможных комбинаций — у n разрядов их 2ⁿ.
Инвертировать разряды при получении дополнительного кода и забыть прибавить единицу — неполный алгоритм. Путаница возникает из-за того, что инверсия заметнее всего меняет запись, но сама по себе ещё не даёт нужного кода. Проверьте результат, пройдя оба шага: инверсия и прибавление единицы с сохранением заданного числа разрядов.
Порядок путают с количеством цифр после точки, потому что оба связаны с расположением точки в записи. Но порядок — показатель степени основания, на которую умножают мантиссу, а не счётчик дробных цифр. Проверка проста: запишите число как мантиссу, умноженную на 2 в степени порядка, и убедитесь, что получается исходное значение.
Ожидать точного представления любой десятичной дроби — значит забывать, что компьютер хранит конечное число двоичных разрядов. Некоторые дроби в двоичной системе бесконечны, и тогда значение приходится округлять. Проверяйте, достаточно ли разрядов для нужной точности, и учитывайте, что небольшое отличие результата может быть следствием округления, а не ошибкой формулы.
Для понимания темы нужны позиционная система счисления, перевод чисел между двоичной и десятичной системами и степени двойки: они объясняют значение каждого разряда. Двоичная арифметика и логические операции пригодятся, чтобы разобраться, как компьютер складывает числа и обрабатывает их разряды. Позже эти знания помогут изучать типы данных, переполнение, погрешности вычислений, компьютерную графику и программирование.
Почему компьютер не хранит числа сразу в десятичном виде?
Электронные схемы надёжно различают два состояния, которым удобно сопоставить 0 и 1. Поэтому числа кодируют двоичными разрядами, а десятичную запись при необходимости получают переводом. Двоичная арифметика также естественно выполняется такими схемами.
Зачем нужен дополнительный код отрицательных чисел?
Дополнительный код позволяет представлять отрицательные числа так, чтобы сложение выполнялось теми же двоичными схемами, что и для положительных. Отдельная операция вычитания во многих случаях сводится к сложению с числом противоположного знака. Это упрощает устройство процессора.
Как по количеству разрядов определить диапазон целых чисел?
Для n беззнаковых разрядов возможны значения от 0 до 2ⁿ − 1. Для знаковых целых в дополнительном коде диапазон равен от −2ⁿ⁻¹ до 2ⁿ⁻¹ − 1. Например, восемь знаковых разрядов дают диапазон от −128 до 127.
Чем представление с плавающей точкой отличается от записи обычной дроби?
При плавающей точке число хранится не как одна последовательность цифр с неизменным местом точки, а как мантисса и порядок. Порядок задаёт смещение точки и позволяет записывать числа разных масштабов. Такое представление охватывает широкий диапазон, но из-за ограниченной длины мантиссы не всегда бывает точным.
Почему результат вычисления иногда оказывается неточным, хотя формула записана правильно?
Некоторые десятичные дроби имеют бесконечную двоичную запись, поэтому компьютер вынужден хранить их приближение. При вычислениях округления могут накапливаться, и итог немного отличается от математически точного значения. Это особенность конечной разрядности, а не обязательно ошибка формулы.
§ 5. Представление чисел в компьютере