Архитектура компьютера
Двоичная система: Язык компьютеров
Цели урока
- Понимать, почему компьютеры используют двоичную систему
- Переводить числа между системами: bin ↔ dec ↔ hex
- Знать единицы: бит, байт, слово
- Понимать знаковые vs беззнаковые числа
- Избегать багов с переполнением
Предварительные знания
- Базовая арифметика
Apple M3 Ultra (2024): 192 ГБ памяти, 800 ГБ/с пропускная способность, 80 ядер CPU. В 1971 году Intel 4004 имел 2300 транзисторов и работал на 108 кГц. Сегодня в чипе M3 Ultra - больше 100 миллиардов транзисторов. Разница в 53 года. Но базовая логика не изменилась ни на бит: 0 и 1, высокое и низкое напряжение. Почему именно двоичная система? Не потому что «два состояния» - физика позволяет сделать десятичную. А потому что при пороге 50% шумовой запас максимален - ошибки интерпретации на электрическом уровне минимальны. Вся сложность современного чипа построена на этом одном инженерном решении 1940-х.
- **Отладка memory dump:** каждый адрес в gdb, lldb, Instruments - это hex. `0x7ffee4b1c2f0` - адрес стека в 64-битном процессе. Без понимания hex отладка нативного кода слепа
- **Битовые флаги в системном API:** Unix permissions (chmod 755 = 111 101 101), HTTP методы, OpenGL state flags - всё это битовые маски. `permissions & 0x04` проверяет один флаг за одну операцию
- **Integer overflow в безопасности:** CVE-2021-3156 (sudo heap overflow), Heartbleed - оба эксплойта используют integer overflow или underflow. `unsigned int len = 0; len - 1 = 4294967295` - классический вектор атаки
Почему двоичная?
Каждый транзистор в процессоре умеет одно: различить, есть напряжение или нет. Два состояния. В чипе M3 Ultra их 100+ миллиардов. Как из такой примитивности возникает 4K-видео, нейросети, операционная система?
Представим выключатель: **ON** (1) или **OFF** (0). Один - два состояния. Восемь выключателей - и картина меняется:
| Выключателей | Комбинаций | Можно закодировать |
|---|---|---|
| 1 | 2 | Да/Нет |
| 2 | 4 | 4 варианта (00, 01, 10, 11) |
| 4 | 16 | Цифра 0-9 + буквы |
| 8 | 256 | Все ASCII символы |
| 32 | 4 млрд | Любой IPv4 адрес |
| 64 | 18 квинтиллионов | Больше атомов на Земле |
**Формула:** n выключателей = 2ⁿ комбинаций. Экспоненциальный рост!
**Почему не троичная?** В СССР работал троичный компьютер «Сетунь» (1958) - три состояния (-1, 0, +1) теоретически эффективнее по плотности информации. Но транзистор надёжнее различает два уровня напряжения, чем три: при пороге 50% шумовой запас максимален. Физика выбрала двоичную, инженеры согласились.
Сколько различных значений можно закодировать 10 битами?
Позиционные системы счисления
Число **234** в десятичной системе - не просто символы на бумаге. Каждая позиция несёт вес:
Любая система счисления работает так же - меняется только **основание**. В hex `FF` - это не буквы, а число 255:
| Система | Основание | Цифры | Применение |
|---|---|---|---|
| Двоичная | 2 | 0, 1 | Внутри компьютера |
| Восьмеричная | 8 | 0-7 | Unix права (chmod 755) |
| Десятичная | 10 | 0-9 | Повседневная жизнь |
| Шестнадцатеричная | 16 | 0-9, A-F | Цвета (#FF0000), память |
**Hex-код цвета:** #FF0000 = красный. FF = 255 (максимум красного), 00 = 0 (нет зелёного), 00 = 0 (нет синего).
В какой системе записано число 777 (права файла в Unix)?
Двоичная -> Десятичная
Каждый бит - степень двойки. Позиция справа (бит 0) весит 1, позиция слева (бит 7) весит 128:
**Лайфхак:** Запомните степени двойки: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024. Программисты узнают их мгновенно!
Чему равно 11111111₂ в десятичной системе?
Десятичная -> Двоичная
**Метод деления на 2:** делим на 2, записываем остатки. Читать снизу вверх - каждый остаток становится битом, от младшего к старшему.
**Метод степеней:** жаднее и нагляднее. Берём максимальную степень двойки, которая не превышает число, ставим 1 - и вычитаем:
**Паттерн:** 42 = 101010 - чередование! 42 = 32 + 8 + 2 = 2⁵ + 2³ + 2¹. Все нечётные степени.
100₁₀ в двоичной системе это:
Шестнадцатеричная система
Двоичные числа длинные: адрес памяти в 32 битах - это 32 знака нулей и единиц. **Hex** решает это: каждые 4 бита дают одну hex-цифру, и `0xDEADBEEF` читабельнее чем 32 бита.
| Dec | Bin | Hex | Dec | Bin | Hex |
|---|---|---|---|---|---|
| 0 | 0000 | 0 | 8 | 1000 | 8 |
| 1 | 0001 | 1 | 9 | 1001 | 9 |
| 2 | 0010 | 2 | 10 | 1010 | A |
| 3 | 0011 | 3 | 11 | 1011 | B |
| 4 | 0100 | 4 | 12 | 1100 | C |
| 5 | 0101 | 5 | 13 | 1101 | D |
| 6 | 0110 | 6 | 14 | 1110 | E |
| 7 | 0111 | 7 | 15 | 1111 | F |
Цвета в вебе
CSS цвета - это RGB в hex
#FF5733 FF = 255 (красный 100%) 57 = 87 (зелёный 34%) 33 = 51 (синий 20%) Итог: оранжево-красный цвет
Чему равен hex-цвет #FFFFFF?
Бит, байт, слово
**Бит** (binary digit) - минимальная единица: 0 или 1. Один транзистор в состоянии заряда.
**Байт** - 8 бит, выбраны исторически как минимум для хранения одного ASCII-символа. Сегодня байт - де-факто атомарная единица адресации памяти во всех процессорах.
| Единица | Размер | Диапазон | Пример |
|---|---|---|---|
| 1 бит | 1 | 0-1 | Да/Нет |
| 1 ниббл | 4 бита | 0-15 | 1 hex цифра |
| 1 байт | 8 бит | 0-255 | ASCII символ |
| 1 слово (word) | 16-64 бита | Зависит от CPU | Адрес памяти |
**Слово (word)** - размер регистра процессора. На 64-bit CPU: 64 бита = 8 байт. Именно поэтому указатели занимают 8 байт, и максимальный адрес памяти - 2^64. Поколение 32-битных CPU ограничивалось 4 ГБ RAM - ровно 2^32 байт.
**Путаница:** 1 КБ = 1024 байт или 1000 байт? Официально: KB = 1000, KiB = 1024. Но большинство программ всё ещё используют KB = 1024.
Сколько бит в 2 байтах?
Знаковые и беззнаковые числа
Только нули и единицы - как представить отрицательные числа? Три исторических подхода, победил один:
**1. Знак-модуль (устаревший):** старший бит - знак (0 = +, 1 = -), остальные - модуль числа.
**2. Дополнительный код (two's complement):** победитель. Инвертируем все биты + прибавляем 1. Элегантность в том, что сложение работает без специальных правил - переполнение просто отбрасывается.
| Тип (C) | Размер | Диапазон |
|---|---|---|
| unsigned char | 8 бит | 0 до 255 |
| signed char | 8 бит | -128 до +127 |
| unsigned int | 32 бита | 0 до 4,294,967,295 |
| signed int | 32 бита | -2,147,483,648 до +2,147,483,647 |
**Баг-ловушка:** Знаковое переполнение. int max = 2147483647; max + 1 = -2147483648 (не ошибка, а wraparound!)
Компьютеры понимают отрицательные числа так же, как люди - просто с добавлением знака
Компьютеры не хранят знак отдельно. В дополнительном коде старший бит имеет отрицательный вес (-128 для 8-битного числа), и из этого автоматически получается вся знаковая арифметика
-1 в 8 битах = `11111111`. Это не «минус» плюс «1111111». Это сумма: -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -128 + 127 = -1. Трюк в том, что сложение `5 + (-5)` работает обычным двоичным сложением - переполнение отбрасывается и получается 0.
Что будет, если 8-битное signed число 127 увеличить на 1?
Двоичная система
- **Двоичная - не произвол:** при пороге 50% шумовой запас максимален. Троичный «Сетунь» (СССР, 1958) теоретически эффективнее, но транзисторы надёжнее различают два состояния, а не три
- **Экспоненциальная мощь:** n бит = 2ⁿ комбинаций. 64 бита = 18 квинтиллионов состояний - больше атомов на Земле. Отсюда адресное пространство 64-битных систем
- **Hex - это просто двоичное сокращение:** 4 бита = 1 hex-цифра. Адрес памяти `0x7FFFFFFF` и 32-битная маска - одно и то же, просто читабельнее
- **Дополнительный код - элегантность через нарушение интуиции:** -1 в 8 битах это `11111111`, и это работает потому что переполнение при сложении отбрасывается
- **Переполнение - не исключение, а поведение:** signed overflow в C - undefined behavior; unsigned - гарантированный wraparound. Различие критично для безопасности
Связанные темы
Двоичная система - фундамент для всего hardware.
- Логические вентили — Как реализовать 0/1 в железе
- АЛУ — Арифметика с двоичными числами
- Побитовые операции — AND, OR, XOR, сдвиги
Вопросы для размышления
- Вспомни любую задачу, где ты сталкивался с побитовыми операциями, переполнением или кодированием данных - что тогда было неочевидным и как понимание двоичной системы помогло бы тебе решить это быстрее?
Связанные уроки
- arch-02-logic-gates — Логические вентили - следующий уровень: как из 0 и 1 строится вычислительная логика
- ar-01-natural — Двоичная система - частный случай позиционной арифметики
- ds-01-arrays — Понимание двоичной адресации памяти объясняет O(1) доступ в массивах
- prog-01-intro — Программирование работает поверх двоичного представления - два взгляда на одну машину
- la-04-matrix-ops