Архитектура компьютера

Двоичная система: Язык компьютеров

Цели урока

  • Понимать, почему компьютеры используют двоичную систему
  • Переводить числа между системами: 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). Один - два состояния. Восемь выключателей - и картина меняется:

ВыключателейКомбинацийМожно закодировать
12Да/Нет
244 варианта (00, 01, 10, 11)
416Цифра 0-9 + буквы
8256Все ASCII символы
324 млрдЛюбой IPv4 адрес
6418 квинтиллионовБольше атомов на Земле

**Формула:** n выключателей = 2ⁿ комбинаций. Экспоненциальный рост!

**Почему не троичная?** В СССР работал троичный компьютер «Сетунь» (1958) - три состояния (-1, 0, +1) теоретически эффективнее по плотности информации. Но транзистор надёжнее различает два уровня напряжения, чем три: при пороге 50% шумовой запас максимален. Физика выбрала двоичную, инженеры согласились.

Сколько различных значений можно закодировать 10 битами?

Позиционные системы счисления

Число **234** в десятичной системе - не просто символы на бумаге. Каждая позиция несёт вес:

Любая система счисления работает так же - меняется только **основание**. В hex `FF` - это не буквы, а число 255:

СистемаОснованиеЦифрыПрименение
Двоичная20, 1Внутри компьютера
Восьмеричная80-7Unix права (chmod 755)
Десятичная100-9Повседневная жизнь
Шестнадцатеричная160-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 бита.

DecBinHexDecBinHex
000000810008
100011910019
200102101010A
300113111011B
401004121100C
501015131101D
601106141110E
701117151111F

Цвета в вебе

CSS цвета - это RGB в hex

#FF5733 FF = 255 (красный 100%) 57 = 87 (зелёный 34%) 33 = 51 (синий 20%) Итог: оранжево-красный цвет

Чему равен hex-цвет #FFFFFF?

Бит, байт, слово

**Бит** (binary digit) - минимальная единица: 0 или 1. Один транзистор в состоянии заряда.

**Байт** - 8 бит, выбраны исторически как минимум для хранения одного ASCII-символа. Сегодня байт - де-факто атомарная единица адресации памяти во всех процессорах.

ЕдиницаРазмерДиапазонПример
1 бит10-1Да/Нет
1 ниббл4 бита0-151 hex цифра
1 байт8 бит0-255ASCII символ
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 char8 бит0 до 255
signed char8 бит-128 до +127
unsigned int32 бита0 до 4,294,967,295
signed int32 бита-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
Двоичная система: Язык компьютеров

0

1

Войти