Формы представления чисел в ЭВМ. Кодирование текстовой и графической информации

Фундаментальное учебное руководство: аппаратные форматы целых и вещественных чисел (стандарт IEEE 754), кодирование символьной информации (ASCII, кодовые страницы, UTF-8/UTF-16) и принципы цифровой растровой графики.

1. Аппаратный уровень: физическая ячейка и семантика данных

На физическом уровне память и регистры процессора представляют собой массивы двухстабильных полупроводниковых триггеров или конденсаторов. Физическое состояние «высокий потенциал / низкий потенциал» интерпретируется как двоичный бит (0 или 1). Однако сам по себе набор битов в аппаратной ячейке памяти не содержит никаких метаданных о своем типе.

Ключевой архитектурный инвариант: Семантика (смысл) данных определяется исключительно кодом машинной команды процессора, обращающейся к данной ячейке памяти. Один и тот же 32-битный массив ячеек может быть прочитан как целое число со знаком (инструкция 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}$.
Диапазон чисел в дополнительном коде: Для $n$-разрядной сетки диапазон составляет $[-2^{n-1};\, 2^{n-1} - 1]$. Обратите внимание на асимметрию: отрицательных чисел на одно больше из-за отсутствия отрицательного нуля. Например, для 8 бит: от $-128$ до $+127$. Для 16 бит: от $-32\,768$ до $+32\,767$.

2.3. Алгоритм получения дополнительного кода на примере числа $-45_{10}$ (8 бит)

  1. Записать абсолютное значение числа в двоичной 8-битной сетке:
    | -45 | = 45_10 = 32 + 8 + 4 + 1 = 00101101_2
  2. Поразрядно инвертировать все биты (получить обратный код):
    NOT(00101101) = 11010010_2
  3. Прибавить единицу к младшему разряду:
      11010010
    +        1
    ----------
      11010011_2 (0xD3)
  4. Аппаратная проверка по весам разрядов:
    -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)
        
Зачем порядок смещается (Biased Exponent)? Смещение порядка на константу (127 для float32) преобразует знаковые степени $e \in [-126; +127]$ в исключительно положительные числа $E \in [1; 254]$. Это позволяет процессору сравнивать вещественные числа как обычные беззнаковые целые числа с помощью целочисленного компаратора, не декодируя знак порядка!

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

  1. Определить знак $S$: число отрицательное $\implies S = 1$.
  2. Перевести абсолютную величину $13.5_{10}$ в двоичную дробь: Целая часть: $13_{10} = 8 + 4 + 1 = 1101_2$.
    Дробная часть: $0.5_{10} = 0.1_2$.
    Итого двоичное представление: $1101.1_2$.
  3. Нормализовать двоичное число: Сдвигаем двоичную запятую влево так, чтобы слева осталась ровно одна единица:
    1101.1_2 = 1.1011_2 * 2^3
    Истинный порядок $e = 3$.
  4. Вычислить смещенный порядок $E$:
    E = e + 127 = 3 + 127 = 130_10 = 10000010_2
  5. Сформировать поле мантиссы (23 бита): Отбрасываем ведущую неявную единицу и запятую (`1.`), берем значащие биты `1011` и дополняем нулями справа до 23 разрядов:
    M = 1011 0000 0000 0000 0000 000_2
  6. Собрать 32-битное слово и перевести в HEX:
      Бит 31: S = 1
      Биты 30..23: E = 10000010
      Биты 22..0:  M = 10110000000000000000000
      
      Двоичный вид: 1100 0001 0101 1000 0000 0000 0000 0000
      Шестнадцатеричный вид: 0xC1580000
Типичная ошибка: проблема неточного представления десятичных дробей. Числа вроде $0.1_{10}$ или $0.2_{10}$ не могут быть точно представлены конечной двоичной дробью ($0.1_{10} = 0.0001100110011\dots_2$ — бесконечная периодическая дробь). Поэтому сложение 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), редкие исторические письменности, специальные графические символы.
Аппаратные преимущества формата UTF-8:
  1. Самосинхронизация: старшие биты первого байта однозначно указывают длину всей последовательности (0... — 1 байт, 110... — 2 байта, 1110... — 3 байта, 11110... — 4 байта). Все последующие байты символа всегда начинаются с 10xxxxxx. При обрыве или повреждении потока данных процессор мгновенно находит границу следующего символа.
  2. Отсутствие проблемы порядка байтов (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. Вопросы для самопроверки

  1. Почему при вычитании в ЭВМ используется дополнительный код, а не прямой? Какое аппаратное преимущество это дает арифметико-логическому устройству?
  2. Из каких трех полей состоит 32-битное число с плавающей точкой IEEE 754? Почему порядок хранится со смещением $+127$?
  3. В чем заключается феномен неявной единицы (implicit leading bit) в мантиссе IEEE 754? Для каких чисел это правило перестает действовать?
  4. Почему строка из 10 русских букв в кодировке Windows-1251 занимает 10 байт, а в кодировке UTF-8 — 20 байт? Как при этом кодируются английские буквы в UTF-8?
  5. Как рассчитать объем видеопамяти для буфера экрана разрешением $1920 \times 1080$ пикселей в режиме 32 бит (RGBA)?

7. Предметное резюме

  • Универсальность бита: аппаратная ячейка памяти универсальна; смысловое назначение битов определяется исключительно исполняемыми инструкциями процессора.
  • Дополнительный код: устраняет коллизию двух нулей и заменяет физический блок вычитания простым суммированием с переносом.
  • IEEE 754: обеспечивает экспоненциальный динамический диапазон с плавающей точностью за счет нормализации и смещенного порядка.
  • UTF-8: индустриальный компромисс переменной длины, сочетающий компактность ASCII и полноту всемирного каталога Unicode.
  • Растровая графика: объем памяти прямо пропорционален числу пикселей и битовой глубине цвета; аппаратные шины требуют выравнивания строк по 4 байта.