Информатика · модуль 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
Загружаю пример…