1. Аппаратный уровень: физическая ячейка и семантика данных
На физическом уровне память и регистры процессора представляют собой массивы двухстабильных полупроводниковых триггеров или конденсаторов. Физическое состояние «высокий потенциал / низкий потенциал» интерпретируется как двоичный бит (0 или 1). Однако сам по себе набор битов в аппаратной ячейке памяти не содержит никаких метаданных о своем типе.
ADD / IMUL), вещественное число (инструкция ADDSS), четыре ASCII-символа или 32-битный цвет пикселя (RGBA).
Физический уровень
Биты, триггеры, ячейки SRAM/DRAM. Единица измерения — байт (8 бит) и машинное слово (16, 32, 64 бита).
Логический уровень
Форматы кодирования: целые числа (двоичный/дополнительный код), вещественные (IEEE 754), таблицы символов, карты растра.
Исполнительный уровень
АЛУ процессора, FPU (блок плавающей точки), строковые инструкции, графические конвейеры GPU.
2. Целые числа с фиксированной точкой (Fixed-Point Numbers)
В архитектуре процессоров числа с фиксированной точкой представлены преимущественно целыми числами, у которых двоичная запятая фиксирована после самого младшего разряда (разряда с весом 20 = 1).
2.1. Беззнаковые целые числа (Unsigned Integers)
В беззнаковом формате все n разрядов ячейки используются для представления абсолютного значения числа. Диапазон значений для n-битной разрядной сетки составляет:
Dunsigned = [0; 2n − 1]
- 8 бит (байт): от 0 до 255 (0016 … FF16).
- 16 бит (слово, Word): от 0 до 65 535 (000016 … FFFF16).
- 32 бита (двойное слово, Dword): от 0 до 4 294 967 295.
- 64 бита (четверное слово, Qword): от 0 до ≈ 1,84 × 1019.
2.2. Знаковые целые числа: прямой, обратный и дополнительный коды
Для представления отрицательных чисел старший (левый) бит разрядной сетки отводится под знак: 0 — положительное число, 1 — отрицательное число.
| Форма представления | Принцип построения для отрицательного числа −X | Недостатки и аппаратные свойства |
|---|---|---|
| Прямой код (Sign-Magnitude) | Знаковый бит = 1, остальные разряды — двоичный модуль числа |X|. | Два нуля (+0 = 000000002, −0 = 100000002). Требует отдельных аппаратных узлов для сложения и вычитания. |
| Обратный код (Ones' Complement) | Знаковый бит = 1, все значащие разряды модуля побитово инвертируются (0 → 1, 1 → 0). | Также сохраняет проблему двух нулей (+0 и −0). При сложении требует циклического переноса единицы из старшего разряда в младший (end-around carry). |
| Дополнительный код (Two's Complement) | Обратный код + 1 к младшему разряду: [−X]доп = NOT(|X|) + 1. | Единственный нуль (000000002). Вычитание аппаратно сводится к сложению: A − B = A + [−B]доп. Вес старшего знакового разряда отрицателен: −2n−1. |
2.3. Алгоритм получения дополнительного кода на примере числа −4510 (8 бит)
- Записать абсолютное значение числа в двоичной 8-битной сетке:
|−45| = 45₁₀ = 32 + 8 + 4 + 1 = 00101101₂
- Поразрядно инвертировать все биты (получить обратный код):
NOT(00101101) = 11010010₂
- Прибавить единицу к младшему разряду:
11010010 + 1 ---------- 11010011₂ (0xD3)
- Аппаратная проверка по весам разрядов:
−128 + 64 + 16 + 2 + 1 = −128 + 83 = −45₁₀
3. Вещественные числа с плавающей точкой: стандарт IEEE 754
Вещественные числа в математике непрерывны и бесконечны. В дискретной разрядной сетке ЭВМ вещественные числа представляются в экспоненциальной (научной) форме с нормализацией:
X = (−1)S × M × 2e
где 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 (28−1 − 1) | 1023 (211−1 − 1) |
| Мантисса (Fraction, F) | 23 бита (разряды 22–0) | 52 бита (разряды 51–0) |
| Неявная единица (Implicit 1) | Присутствует: эффективная длина мантиссы 24 бита (1.F) | Присутствует: эффективная длина мантиссы 53 бита (1.F) |
| Динамический диапазон | от ≈ ±1,18 × 10−38 до ≈ ±3,4 × 1038 | от ≈ ±2,23 × 10−308 до ≈ ±1,8 × 10308 |
| Десятичная точность | ≈ 7 значащих десятичных цифр | ≈ 15–17 значащих десятичных цифр |
3.2. Архитектурная структура 32-битного числа IEEE 754 Single
31 30 23 22 0
+--+------------+----------------------------------------------------+
|S | E (8 бит) | M (23 бита) |
+--+------------+----------------------------------------------------+
1 смещенный дробная часть мантиссы
бит порядок (без неявной единицы)
знака (e + 127)
3.3. Специальные значения стандарта IEEE 754
- Нуль (±0): E = 0, M = 0. Знак S = 0 дает +0, S = 1 дает −0.
- Денормализованные числа: E = 0, M ≠ 0. Значение: (−1)S × (0.M) × 2−126. Позволяют плавно снижать точность вблизи нуля (gradual underflow).
- Бесконечность (±∞): E = 255 (111111112), M = 0. Возникает при делении ненулевого числа на ноль или при переполнении (overflow).
- Не-число (NaN — Not a Number): E = 255, M ≠ 0. Возникает при неопределенных операциях (0 / 0, √−1, ∞ − ∞). Различают тихий (qNaN) и сигнальный (sNaN).
3.4. Пошаговый алгоритм перевода числа −13,510 в IEEE 754 Single
- Определить знак S: число отрицательное ⇒ S = 1.
- Перевести абсолютную величину 13,510 в двоичную дробь:
Целая часть: 1310 = 8 + 4 + 1 = 11012.
Дробная часть: 0,510 = 0,12.
Итого двоичное представление: 1101,12. - Нормализовать двоичное число:
Сдвигаем двоичную запятую влево так, чтобы слева осталась ровно одна единица:
1101,1₂ = 1,1011₂ × 2³
Истинный порядок e = 3. - Вычислить смещенный порядок E:
E = e + 127 = 3 + 127 = 130₁₀ = 10000010₂
- Сформировать поле мантиссы (23 бита):
Отбрасываем ведущую неявную единицу и двоичную точку (
1.), берем значащие биты1011и дополняем нулями справа до 23 разрядов:M = 1011 0000 0000 0000 0000 000₂
- Собрать 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 кодов, 0016 … 7F16). Содержит цифры
0-9, латинские буквыA-Z,a-z, базовые знаки пунктуации и 32 управляющих символа (CR, LF, TAB, NUL, ESC). В памяти выравнивается до 1 байта (старший бит равен 0). - Расширенные 8-битные кодировки: 8-й бит позволил расширить диапазон до 256 кодов (8016 … FF16). Вторая половина таблицы использовалась под национальные алфавиты. Для русского языка возникли несовместимые страницы: 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 × H): количество пикселей по горизонтали (ширина W) и по вертикали (высота H). Общее число пикселей N = W × H.
- Битовая глубина цвета (b, bit depth): количество бит, выделяемое для кодирования цвета одного пикселя.
- Количество воспроизводимых цветов (K): связано с битовой глубиной формулой Хартли: K = 2b.
| Глубина цвета (b) | Число цветов (K = 2b) | Способ организации цвета | Типичное применение |
|---|---|---|---|
| 1 бит | 21 = 2 | Монохромный (черно-белый) | Чертежи, факсы, сканированный текст, простые иконки |
| 4 бита | 24 = 16 | Индексированная палитра (EGA) | Ретро-игры, простые пиктограммы, служебные значки ОС |
| 8 бит | 28 = 256 | Индексированная палитра (VGA) или градация серого | GIF-анимация, текстуры с фиксированной палитрой |
| 24 бита | 224 ≈ 16,7 млн | TrueColor (RGB 8:8:8 — по 8 бит на Red, Green, Blue) | Цифровая фотография, мониторы, дизайн, JPEG-снимки |
| 32 бита | 224 цветов + 256 градиентов альфа-канала | RGBA (8 бит R, 8 бит G, 8 бит B, 8 бит Alpha-прозрачность) | Интерфейсы ОС, спрайты с прозрачностью, текстуры 3D-графики |
5.2. Формула расчета объема несжатого растра
Информационный объем сырых несжатых пиксельных данных вычисляется по формуле:
Vbits = W × H × b (бит)
Vbytes = (W × H × b) / 8 (байт)
5.3. Аппаратное выравнивание строк растра (Scanline Alignment)
На уровне архитектуры памяти и контроллеров дисплея чтение данных происходит порциями по 32 бита (4 байта). В формате растровых файлов BMP (DIB) длина каждой горизонтальной строки пикселей обязана быть кратна 4 байтам.
Если строка пикселей занимает число байт, не кратное 4, в конец строки дописываются от 1 до 3 холостых нулевых байтов (padding):
Байт на строку = ((W × b + 31) / 32) × 4 // деление целочисленное
Пример: Иконка 16 × 16 в монохроме (b = 1).
Чистые данные: 16 × 1 = 16 бит = 2 байта на строку. Ближайшее кратное 4 число — 4 байта (добавляется 2 байта паддинга).
Полный объем массива пикселей в файле BMP составит 4 × 16 = 64 байта (вместо 32 байт сырых данных).
6. Вопросы для самопроверки
- Почему при вычитании в ЭВМ используется дополнительный код, а не прямой? Какое аппаратное преимущество это дает арифметико-логическому устройству?
- Из каких трех полей состоит 32-битное число с плавающей точкой IEEE 754? Почему порядок хранится со смещением +127?
- В чем заключается феномен неявной единицы (implicit leading bit) в мантиссе IEEE 754? Для каких чисел это правило перестает действовать?
- Почему строка из 10 русских букв в кодировке Windows-1251 занимает 10 байт, а в кодировке UTF-8 — 20 байт? Как при этом кодируются английские буквы в UTF-8?
- Как рассчитать объем видеопамяти для буфера экрана разрешением 1920 × 1080 пикселей в режиме 32 бит (RGBA)?
7. Предметное резюме
- Универсальность бита: аппаратная ячейка памяти универсальна; смысловое назначение битов определяется исключительно исполняемыми инструкциями процессора.
- Дополнительный код: устраняет коллизию двух нулей и заменяет физический блок вычитания простым суммированием с переносом.
- IEEE 754: обеспечивает экспоненциальный динамический диапазон с плавающей точностью за счет нормализации и смещенного порядка.
- UTF-8: индустриальный компромисс переменной длины, сочетающий компактность ASCII и полноту всемирного каталога Unicode.
- Растровая графика: объем памяти прямо пропорционален числу пикселей и битовой глубине цвета; аппаратные шины требуют выравнивания строк по 4 байта.