Как число хранится в памяти компьютера: калькулятор IEEE 754 и дополнительного кода
Как и зачем переводить числа в машинный код?
Представьте, что вы заглянули «под капот» вашего компьютера. Процессор не понимает привычные нам цифры вроде 5, 100 или -42. Вся информация для него — это физические импульсы электричества: есть напряжение (единица) или нет напряжения (ноль). Наш инструмент наглядно показывает, в какую именно цепочку нулей и единиц процессор превращает введенные вами данные.
Зачем нужен дополнительный код?
Если с обычными (положительными) числами всё интуитивно понятно — они просто переводятся в двоичную систему счисления, то с отрицательными числами возникает проблема. Как компьютеру понять, что перед ним число со знаком «минус», если у него нет символа минуса, а есть только 0 и 1?
Для решения этой задачи инженеры придумали дополнительный код (Two's complement). Это изящный математический трюк, который позволяет процессору складывать положительные и отрицательные числа совершенно одинаково, не усложняя внутренние микросхемы.
Процесс получения такого кода состоит из трех шагов:
- Прямой код: Берем число по модулю (без минуса), переводим в двоичный вид, а самый первый (левый) бит делаем единицей — это сигнал, что число отрицательное.
- Обратный код: Берем прямой код и меняем в нем все нули на единицы, а единицы на нули. При этом бит знака мы не трогаем.
- Дополнительный код: К получившемуся обратному коду просто прибавляем единицу. Готово! Именно этот результат и отправляется в оперативную память.
Как хранятся числа с запятой (стандарт IEEE 754)
Если в вашем числе есть дробная часть (например, 3.14), обычный перевод не сработает. Бесконечные дроби нужно как-то уместить в строгие рамки 32 или 64 бит. Для этого весь мир использует единый стандарт IEEE 754.
Алгоритм разбивает ваше число на три отдельных контейнера:
- Знак: Всего один бит. Ноль означает плюс, единица — минус.
- Порядок (Экспонента): Показывает, на сколько позиций процессору нужно «сдвинуть запятую», чтобы правильно прочитать значение.
- Мантисса: Самая длинная часть. В ней хранятся непосредственно сами цифры числа (значащая часть).
Этот калькулятор будет полезен студентам и начинающим программистам на языках C/C++ или Ассемблер. Вы можете использовать его для самопроверки при решении задач по архитектуре ЭВМ и информатике.
Как процессор видит целые отрицательные числа
Компьютер не понимает знак «минус». Для него существует только наличие напряжения в ячейке памяти (1) или его отсутствие (0). Чтобы научить машину работать с отрицательными значениями, инженеры придумали изящный математический трюк — дополнительный код (Two's complement).
Благодаря ему процессору не нужен отдельный блок для вычитания. Операция 10 - 4 внутри процессора выглядит как сложение: 10 + (-4). Чтобы это сработало, число проходит три стадии трансформации.
Пример расчета: прячем число -42 в один байт (8 бит)
Представьте, что вы пишете программу на С++ и создаете переменную int8_t a = -42;. Вот что произойдет внутри процессора:
- Прямой код (модуль числа): Переводим число 42 в двоичную систему. Получаем
00101010. Крайний левый ноль означает, что число положительное. Но нам нужен минус, поэтому левый бит меняем на единицу:10101010. - Обратный код: Берем прямой код и меняем все нули на единицы, а единицы на нули. Знаковый (первый) бит при этом не трогаем! Получаем:
11010101. - Дополнительный код: К полученному возвратному коду прибавляем обычную математическую единицу (1). Итог:
11010110.
Именно комбинация 11010110 запишется на жесткий диск или в оперативную память.
Дробные числа и стандарт IEEE 754
С целыми числами все решается простой конвертацией. Но как сохранить число Пи (3.14159...), если количество ячеек памяти строго ограничено 32 или 64 битами? Здесь вступает в игру международный стандарт IEEE 754. Он заставляет компьютер хранить числа в формате научной нотации.
Вместо того чтобы запоминать число целиком, память разбивается на три изолированных контейнера:
| Блок | За что отвечает | Суть простыми словами |
|---|---|---|
| Знак (1 бит) | Плюс (0) или минус (1) | Определяет направление на числовой оси. |
| Экспонента / Порядок (8 или 11 бит) | Смещение запятой | Показывает процессору, на сколько позиций нужно сдвинуть запятую влево или вправо при восстановлении числа. Хранится со специальным смещением (bias). |
| Мантисса (23 или 52 бита) | Значащие цифры | Сама "дробь". Целая часть (всегда равна 1) отбрасывается для экономии места, сохраняется только хвост после запятой. |
Главные ошибки студентов на экзаменах
- Забыть про неявную единицу в мантиссе. При восстановлении числа из формата IEEE 754 к мантиссе всегда нужно прибавлять
1.(единицу с запятой), иначе результат будет искажен. - Инвертировать знаковый бит. При поиске обратного кода для целых чисел новички часто инвертируют вообще все биты. Крайний левый бит (знак) всегда должен оставаться нетронутым.
- Путать разрядность. Число 5 в 8-битной системе выглядит как
00000101, а в 16-битной — как00000000 00000101. Если вы забудете дописать нули слева, дальнейший расчет дополнительного кода будет неверным.