ИнтВиз

Информатика · модуль 11 из 14

Двоичный код: как процессор хранит числа

Нажимайте на биты, чтобы переключать их. Одни и те же биты читаются как число без знака или как число со знаком в дополнительном коде.

Теория

Позиционная система счисления с основанием 2 записывает число набором битов $b_{n-1} \dots b_1 b_0$:

$$ x = \sum_{i=0}^{n-1} b_i \cdot 2^i . $$

Восьмеричная и шестнадцатеричная записи группируют биты по три и по четыре: $1011\,0010_2 = \mathrm{B2}_{16} = 262_8 = 178_{10}$.

Дополнительный код. Целые числа со знаком хранятся так, что старший бит имеет отрицательный вес:

$$ x = -b_{n-1} \cdot 2^{n-1} + \sum_{i=0}^{n-2} b_i \cdot 2^i . $$

Диапазон $n$-битного числа со знаком — от $-2^{n-1}$ до $2^{n-1} - 1$, без знака — от $0$ до $2^n - 1$. Сложение и вычитание выполняются одинаково для обоих представлений, по модулю $2^n$. Смена знака: $-x = \overline{x} + 1$, где $\overline{x}$ — побитовая инверсия.

Переполнение. Результат, выходящий за диапазон, «заворачивается»: в int8 $127 + 1 = -128$, в uint8 $0 - 1 = 255$. Сдвиг влево на один бит умножает число на 2, сдвиг вправо — делит нацело; при сдвиге влево старший бит теряется.

Где это применяется в IT

Целый тип в C, Java, Rust или NumPy занимает фиксированное число бит. При выходе за диапазон ошибки нет: значение просто переходит на другой край диапазона.

  • Аварии из-за переполнения. В 1996 году ракета Ariane 5 была потеряна из-за переполнения при переводе числа в 16-битное целое.
  • Счётчики. В 2014 году счётчик просмотров YouTube превысил $2^{31} - 1$, и его перевели на 64-битные числа.
  • Повседневная двоичная запись. Цвета #2551D9, права доступа chmod 755 и маски подсетей — те же двоичные и шестнадцатеричные числа.

Код на Python

Загружаю пример…