Представление чисел в компьютере
💻 Информатика · 10 класс
Целые и вещественные числа, системы счисления.

Как компьютер хранит числа
Внутри компьютера нет привычных нам десятичных цифр. Любая информация в нём кодируется последовательностью двух состояний: есть сигнал или нет, заряжена ячейка памяти или разряжена. Эти два состояния обозначают цифрами 0 и 1, а сама запись чисел такими цифрами называется двоичной системой счисления. Один разряд (0 или 1) — это бит, восемь битов образуют байт. Чтобы понять, как машина работает с числами, нужно разобраться в системах счисления и в том, чем отличается хранение целых чисел от вещественных.
Позиционные системы счисления
Система счисления называется позиционной, если значение цифры зависит от её позиции в записи. Привычная нам десятичная система имеет основание 10: число 253 означает 2·100 + 5·10 + 3·1. Точно так же устроены двоичная (основание 2), восьмеричная (8) и шестнадцатеричная (16) системы. В последней не хватает обычных цифр, поэтому к ним добавляют буквы A, B, C, D, E, F для обозначения значений от 10 до 15.
| Система | Основание | Цифры | Где применяют |
|---|---|---|---|
| Двоичная | 2 | 0, 1 | внутреннее представление в памяти |
| Восьмеричная | 8 | 0–7 | запись прав доступа в системах |
| Десятичная | 10 | 0–9 | повседневные вычисления |
| Шестнадцатеричная | 16 | 0–9, A–F | цвета, адреса памяти |
Перевод числа в двоичную систему
Чтобы перевести целое число из десятичной системы в двоичную, его последовательно делят на 2 и записывают остатки снизу вверх.
Переведём 13 в двоичную систему:
13 : 2 = 6, остаток 1
6 : 2 = 3, остаток 0
3 : 2 = 1, остаток 1
1 : 2 = 0, остаток 1
Читаем остатки снизу вверх: 1101
Проверка: 1·8 + 1·4 + 0·2 + 1·1 = 13Целые и вещественные числа
Целые числа хранятся в памяти точно: каждому отводится фиксированное число байтов. Например, в одном байте (8 битов) помещаются значения от 0 до 255. Чтобы хранить и отрицательные числа, применяют дополнительный код: старший бит становится знаковым, и тогда тот же байт хранит числа от −128 до 127.
Вещественные (дробные) числа хранятся иначе — в формате с плавающей запятой. Число разбивается на знак, мантиссу (значащие цифры) и порядок (степень двойки). Это позволяет хранить очень большие и очень маленькие величины, но почти всегда — приближённо. Именно поэтому компьютер может выдать, что 0.1 + 0.2 не равно ровно 0.3: дробь 0,1 не представляется в двоичной системе конечным числом разрядов.
Частые ошибки. Не путайте бит и байт: 8 битов = 1 байт. При переводе в двоичную систему остатки читают снизу вверх, а не сверху вниз. И помните: вещественные числа в компьютере хранятся приближённо, поэтому сравнивать их на точное равенство опасно.
Как устроен двоичный формат с плавающей точкой
В форматах IEEE 754 binary32 и binary64 биты делятся на знак, поле порядка и поле дроби. Для обычного нормализованного числа значение равно (−1)ˢ·(1 + f/2ᵖ)·2ᴱ⁻ᵇⁱᵃˢ, где f — целое значение поля дроби. Начальная единица хранится неявно.
| Формат | Всего бит | Знак | Порядок | Поле дроби p | Смещение |
|---|---|---|---|---|---|
| binary32 | 32 | 1 | 8 | 23 | 127 |
| binary64 | 64 | 1 | 11 | 52 | 1023 |
Оригинальный разбор числа 6,5
6,5₁₀ = 110,1₂ = 1,101₂·2². Для binary32 знак s = 0; записанный порядок E = 2 + 127 = 129 = 10000001₂; поле дроби начинается с 101, дальше нули до 23 бит. Дробная часть 0,101₂ равна 1/2 + 1/8 = 0,625, поэтому восстановленное число (1 + 0,625)·4 = 6,5. Эта дробь представляется точно.
Что выходит за обычную формулу
При нулевом поле порядка действуют отдельные правила для нуля и субнормальных чисел; при всех единицах порядка кодируются бесконечности или NaN. Поэтому нельзя декодировать любой набор бит формулой нормализованного числа. Положительный и отрицательный нули имеют разные знаковые биты.
Проверяем округление на Python
import math
print(0.1 + 0.2 == 0.3) # False
print(math.isclose(0.1 + 0.2, 0.3)) # True
print(6.5.as_integer_ratio()) # (13, 2)На обычных платформах Python float использует двоичную двойную точность. Дробь 0,1 имеет бесконечную двоичную запись и округляется; 6,5 имеет конечную запись и хранится точно. Допуски при сравнении выбирают по задаче, особенно рядом с нулём: значение по умолчанию не универсальная мера точности эксперимента.
Целые числа тоже имеют ограничения конкретного представления. Фиксированный знаковый тип ограничен разрядностью; Python int расширяется по мере необходимости в пределах доступной памяти. Нельзя переносить диапазон одного машинного байта на любой целый тип.
Справочные материалы: Как компьютер хранит числа — исходная тема. Связанные уроки: Алгоритмы и их эффективность, Трассировка алгоритма по шагам.
Первоисточники: Oracle: поля IEEE single и double, Python: двоичные дроби и округление.
Кратко о главном
- Внутри компьютера все числа кодируются двоичной системой из 0 и 1.
- В позиционной системе значение цифры зависит от её позиции; основание определяет набор цифр.
- Перевод в двоичную систему — это деление на 2 с чтением остатков снизу вверх.
- Целые числа хранятся точно, отрицательные — в дополнительном коде.
- Вещественные числа хранятся с плавающей запятой и почти всегда приближённо.