1. Аппаратный уровень: физическая ячейка и семантика данных
На физическом уровне память и регистры процессора представляют собой массивы двухстабильных полупроводниковых триггеров или конденсаторов. Физическое состояние «высокий потенциал / низкий потенциал» интерпретируется как двоичный бит (0 или 1). Однако сам по себе набор битов в аппаратной ячейке памяти не содержит никаких метаданных о своем типе.
ADD / IMUL), вещественное число (инструкция ADDSS), четыре ASCII-символа или 32-битный цвет пикселя (RGBA).
Физический уровень
Биты, триггеры, ячейки SRAM/DRAM. Единица измерения — байт (8 бит) и машинное слово (16, 32, 64 бита).
Логический уровень
Форматы кодирования: целые числа (двоичный/дополнительный код), вещественные (IEEE 754), таблицы символов, карты растра.
Исполнительный уровень
АЛУ процессора, FPU (блок плавающей точки), строковые инструкции, графические конвейеры GPU.
2. Целые числа с фиксированной точкой (Fixed-Point Numbers)
В архитектуре процессоров числа с фиксированной точкой представлены преимущественно целыми числами, у которых двоичная запятая фиксирована после самого младшего разряда (разряда с весом $2^0 = 1$).
2.1. Беззнаковые целые числа (Unsigned Integers)
В беззнаковом формате все $n$ разрядов ячейки используются для представления абсолютного значения числа. Диапазон значений для $n$-битной разрядной сетки составляет:
$D_{\text{unsigned}} = [0;\, 2^n - 1]$
- 8 бит (байт): от $0$ до $255$ ($00_{16} \dots \text{FF}_{16}$).
- 16 бит (слово, Word): от $0$ до $65\,535$ ($0000_{16} \dots \text{FFFF}_{16}$).
- 32 бита (двойное слово, Dword): от $0$ до $4\,294\,967\,295$.
- 64 бита (четверное слово, Qword): от $0$ до $\approx 1.84 \times 10^{19}$.
2.2. Знаковые целые числа: прямой, обратный и дополнительный коды
Для представления отрицательных чисел старший (левый) бит разрядной сетки отводится под знак: 0 — положительное число, 1 — отрицательное число.
| Форма представления | Принцип построения для отрицательного числа $-X$ | Недостатки и аппаратные свойства |
|---|---|---|
| Прямой код (Sign-Magnitude) | Знаковый бит $= 1$, остальные разряды — двоичный модуль числа $|X|$. | Два нуля ($+0 = 00000000_2$, $-0 = 10000000_2$). Требует отдельных аппаратных узлов для сложения и вычитания. |
| Обратный код (Ones' Complement) | Знаковый бит $= 1$, все значащие разряды модуля побитово инвертируются ($0 \to 1, 1 \to 0$). | Также сохраняет проблему двух нулей ($+0$ и $-0$). При сложении требует циклического переноса единицы из старшего разряда в младший (end-around carry). |
| Дополнительный код (Two's Complement) | Обратный код $+ 1$ к младшему разряду: $[-X]_{\text{доп}} = \text{NOT}(|X|) + 1$. | Единственный нуль ($00000000_2$). Вычитание аппаратно сводится к сложению: $A - B = A + [-B]_{\text{доп}}$. Вес старшего знакового разряда отрицателен: $-2^{n-1}$. |
2.3. Алгоритм получения дополнительного кода на примере числа $-45_{10}$ (8 бит)
- Записать абсолютное значение числа в двоичной 8-битной сетке:
| -45 | = 45_10 = 32 + 8 + 4 + 1 = 00101101_2
- Поразрядно инвертировать все биты (получить обратный код):
NOT(00101101) = 11010010_2
- Прибавить единицу к младшему разряду:
11010010 + 1 ---------- 11010011_2 (0xD3)
- Аппаратная проверка по весам разрядов:
-128 + 64 + 16 + 2 + 1 = -128 + 83 = -45_10
3. Вещественные числа с плавающей точкой: стандарт IEEE 754
Вещественные числа в математике непрерывны и бесконечны. В дискретной разрядной сетке ЭВМ вещественные числа представляются в экспоненциальной (научной) форме с нормализацией:
$X = (-1)^S \times M \times 2^e$
где $S$ — знаковый бит, $M$ — мантисса (дробная часть), $e$ — истинный порядок (двоичный показатель степени). Общемировым стандартом представления чисел с плавающей точкой на уровне процессоров (FPU, SSE, AVX, ARM NEON) является IEEE 754.
3.1. Форматы одинарной (Single) и двойной (Double) точности
| Параметр | Одинарная точность (Single, float, 32 бита) | Двойная точность (Double, double, 64 бита) |
|---|---|---|
| Бит знака ($S$) | 1 бит (разряд 31) | 1 бит (разряд 63) |
| Смещенный порядок ($E$) | 8 бит (разряды 30–23) | 11 бит (разряды 62–52) |
| Смещение порядка (Bias) | $127$ ($2^{8-1} - 1$) | $1023$ ($2^{11-1} - 1$) |
| Мантисса (Fraction, $F$) | 23 бита (разряды 22–0) | 52 бита (разряды 51–0) |
| Неявная единица (Implicit 1) | Присутствует: эффективная длина мантиссы 24 бита ($1.F$) | Присутствует: эффективная длина мантиссы 53 бита ($1.F$) |
| Динамический диапазон | от $\approx \pm 1.18 \times 10^{-38}$ до $\approx \pm 3.4 \times 10^{38}$ | от $\approx \pm 2.23 \times 10^{-308}$ до $\approx \pm 1.8 \times 10^{308}$ |
| Десятичная точность | $\approx 7$ значащих десятичных цифр | $\approx 15\text{--}17$ значащих десятичных цифр |
3.2. Архитектурная структура 32-битного числа IEEE 754 Single
31 30 23 22 0
+--+------------+----------------------------------------------------+
|S | E (8 бит) | M (23 бита) |
+--+------------+----------------------------------------------------+
1 смещенный дробная часть мантиссы
бит порядок (без неявной единицы)
знака (e + 127)
3.3. Специальные значения стандарта IEEE 754
- Нуль ($\pm 0$): $E = 0$, $M = 0$. Знак $S=0$ дает $+0$, $S=1$ дает $-0$.
- Денормализованные числа: $E = 0$, $M \neq 0$. Значение: $(-1)^S \times (0.M) \times 2^{-126}$. Позволяют плавно снижать точность вблизи нуля (gradual underflow).
- Бесконечность ($\pm \infty$): $E = 255$ ($11111111_2$), $M = 0$. Возникает при делении ненулевого числа на ноль или при переполнении (overflow).
- Не-число (NaN — Not a Number): $E = 255$, $M \neq 0$. Возникает при неопределенных операциях ($0 / 0$, $\sqrt{-1}$, $\infty - \infty$). Различают тихий (qNaN) и сигнальный (sNaN).
3.4. Пошаговый алгоритм перевода числа $-13.5_{10}$ в IEEE 754 Single
- Определить знак $S$: число отрицательное $\implies S = 1$.
- Перевести абсолютную величину $13.5_{10}$ в двоичную дробь:
Целая часть: $13_{10} = 8 + 4 + 1 = 1101_2$.
Дробная часть: $0.5_{10} = 0.1_2$.
Итого двоичное представление: $1101.1_2$. - Нормализовать двоичное число:
Сдвигаем двоичную запятую влево так, чтобы слева осталась ровно одна единица:
1101.1_2 = 1.1011_2 * 2^3
Истинный порядок $e = 3$. - Вычислить смещенный порядок $E$:
E = e + 127 = 3 + 127 = 130_10 = 10000010_2
- Сформировать поле мантиссы (23 бита):
Отбрасываем ведущую неявную единицу и запятую (`1.`), берем значащие биты `1011` и дополняем нулями справа до 23 разрядов:
M = 1011 0000 0000 0000 0000 000_2
- Собрать 32-битное слово и перевести в HEX:
Бит 31: S = 1 Биты 30..23: E = 10000010 Биты 22..0: M = 10110000000000000000000 Двоичный вид: 1100 0001 0101 1000 0000 0000 0000 0000 Шестнадцатеричный вид: 0xC1580000
0.1 + 0.2 в стандарте IEEE 754 дает 0.30000000000000004. Это фундаментальное ограничение двоичной системы счисления, а не сбой процессора.
4. Кодирование символьной и текстовой информации
Компьютер не оперирует буквами и знаками непосредственно — он хранит числовые коды символов, которые при выводе отображаются шрифтовым генератором в графические глифы.
4.1. Таблица ASCII и однобайтовые кодовые страницы
- ASCII (American Standard Code for Information Interchange): 7-битный стандарт (128 кодов, $00_{16} \dots 7F_{16}$). Содержит цифры
0-9, латинские буквыA-Z,a-z, базовые знаки пунктуации и 32 управляющих символа (CR, LF, TAB, NUL, ESC). В памяти выравнивается до 1 байта (старший бит равен 0). - Расширенные 8-битные кодировки: 8-й бит позволил расширить диапазон до 256 кодов ($80_{16} \dots \text{FF}_{16}$). Вторая половина таблицы использовалась под национальные алфавиты. Для русского языка возникли несовместимые страницы: Windows-1251 (CP1251), KOI-8R, CP866 (DOS), ISO 8859-5. Текст, закодированный в одной кодовой странице и открытый в другой, превращался в нечитаемый набор символов («кракозябры»).
4.2. Стандарт Unicode и кодировка UTF-8
Стандарт Unicode присваивает каждому символу всех письменностей мира уникальный абстрактный номер — кодовую позицию (Code Point) в виде U+XXXX. Общее пространство адресов насчитывает $1\,114\,112$ кодовых позиций (17 плоскостей по $65\,536$ символов).
Для сохранения кодовых позиций в памяти и сетевых протоколах используются схемы трансформации (UTF — Unicode Transformation Format):
| Диапазон кодов Unicode (Code Point) | Длина UTF-8 | Битовый шаблон UTF-8 (префиксы и значащие биты) | Область применения |
|---|---|---|---|
U+0000 ... U+007F |
1 байт | 0xxxxxxx (7 значащих бит) |
Символы стандартного ASCII (латиница, цифры, знаки). Полная совместимость со старыми ASCII-системами! |
U+0080 ... U+07FF |
2 байта | 110xxxxx 10xxxxxx (11 значащих бит) |
Кириллица (диапазон U+0400..U+04FF), греческий, арабский, иврит. Каждая русская буква занимает ровно 2 байта! |
U+0800 ... U+FFFF |
3 байта | 1110xxxx 10xxxxxx 10xxxxxx (16 значащих бит) |
Базовая многоязычная плоскость (BMP): китайские, японские и корейские иероглифы (CJK), математические символы. |
U+10000 ... U+10FFFF |
4 байта | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (21 бит) |
Дополнительные плоскости: эмодзи (Emoji), редкие исторические письменности, специальные графические символы. |
- Самосинхронизация: старшие биты первого байта однозначно указывают длину всей последовательности (
0...— 1 байт,110...— 2 байта,1110...— 3 байта,11110...— 4 байта). Все последующие байты символа всегда начинаются с10xxxxxx. При обрыве или повреждении потока данных процессор мгновенно находит границу следующего символа. - Отсутствие проблемы порядка байтов (Endianness): поскольку единицей обработки UTF-8 является 8-битный байт, в отличие от UTF-16 и UTF-32, порядок байтов процессора (Little-Endian или Big-Endian) не влияет на чтение. Метка порядка байтов (BOM) для UTF-8 не обязательна и не рекомендуется.
5. Кодирование графической информации
В современных вычислительных системах применяются два фундаментально различных подхода к цифровому кодированию визуальной информации: растровый и векторный.
Растровое представление
Изображение разбивается на прямоугольную сетку дискретных точек — пикселей (picture elements). Для каждого пикселя сохраняется код его цвета. Идеально для фотографий и сложных текстур.
Векторное представление
Изображение описывается набором математических формул и геометрических примитивов (точки, линии, кривые Безье, многоугольники, заливки). Масштабируется без потери качества.
5.1. Параметры растрового изображения
- Пространственное разрешение ($W \times H$): количество пикселей по горизонтали (ширина $W$) и по вертикали (высота $H$). Общее число пикселей $N = W \times H$.
- Битовая глубина цвета ($b$, bit depth): количество бит, выделяемое для кодирования цвета одного пикселя.
- Количество воспроизводимых цветов ($K$): связано с битовой глубиной формулой Хартли: $K = 2^b$.
| Глубина цвета ($b$) | Число цветов ($K = 2^b$) | Способ организации цвета | Типичное применение |
|---|---|---|---|
| 1 бит | $2^1 = 2$ | Монохромный (черно-белый) | Чертежи, факсы, сканированный текст, простые иконки |
| 4 бита | $2^4 = 16$ | Индексированная палитра (EGA) | Ретро-игры, простые пиктограммы, служебные значки ОС |
| 8 бит | $2^8 = 256$ | Индексированная палитра (VGA) или градация серого | GIF-анимация, текстуры с фиксированной палитрой |
| 24 бита | $2^{24} \approx 16.7$ млн | TrueColor (RGB 8:8:8 — по 8 бит на Red, Green, Blue) | Цифровая фотография, мониторы, дизайн, JPEG-снимки |
| 32 бита | $2^{24}$ цветов $+ 256$ градиентов альфа-канала | RGBA (8 бит R, 8 бит G, 8 бит B, 8 бит Alpha-прозрачность) | Интерфейсы ОС, спрайты с прозрачностью, текстуры 3D-графики |
5.2. Формула расчета объема несжатого растра
Информационный объем сырых несжатых пиксельных данных вычисляется по формуле:
$V_{\text{bits}} = W \times H \times b \quad \text{(бит)}$
$V_{\text{bytes}} = \dfrac{W \times H \times b}{8} \quad \text{(байт)}$
5.3. Аппаратное выравнивание строк растра (Scanline Alignment)
На уровне архитектуры памяти и контроллеров дисплея чтение данных происходит порциями по 32 бита (4 байта). В формате растровых файлов BMP (DIB) длина каждой горизонтальной строки пикселей обязана быть кратна 4 байтам.
Если строка пикселей занимает число байт, не кратное 4, в конец строки дописываются от 1 до 3 холостых нулевых байтов (padding):
Байт на строку = ((W * b + 31) / 32) * 4
Пример: Иконка $16 \times 16$ в монохроме ($b=1$).
Чистые данные: $16 \times 1 = 16$ бит = 2 байта на строку. Ближайшее кратное 4 число — 4 байта (добавляется 2 байта паддинга).
Полный объем массива пикселей в файле BMP составит $4 \times 16 = 64$ байта (вместо $32$ байт сырых данных).
6. Вопросы для самопроверки
- Почему при вычитании в ЭВМ используется дополнительный код, а не прямой? Какое аппаратное преимущество это дает арифметико-логическому устройству?
- Из каких трех полей состоит 32-битное число с плавающей точкой IEEE 754? Почему порядок хранится со смещением $+127$?
- В чем заключается феномен неявной единицы (implicit leading bit) в мантиссе IEEE 754? Для каких чисел это правило перестает действовать?
- Почему строка из 10 русских букв в кодировке Windows-1251 занимает 10 байт, а в кодировке UTF-8 — 20 байт? Как при этом кодируются английские буквы в UTF-8?
- Как рассчитать объем видеопамяти для буфера экрана разрешением $1920 \times 1080$ пикселей в режиме 32 бит (RGBA)?
7. Предметное резюме
- Универсальность бита: аппаратная ячейка памяти универсальна; смысловое назначение битов определяется исключительно исполняемыми инструкциями процессора.
- Дополнительный код: устраняет коллизию двух нулей и заменяет физический блок вычитания простым суммированием с переносом.
- IEEE 754: обеспечивает экспоненциальный динамический диапазон с плавающей точностью за счет нормализации и смещенного порядка.
- UTF-8: индустриальный компромисс переменной длины, сочетающий компактность ASCII и полноту всемирного каталога Unicode.
- Растровая графика: объем памяти прямо пропорционален числу пикселей и битовой глубине цвета; аппаратные шины требуют выравнивания строк по 4 байта.