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

Фундаментальное учебное руководство: аппаратные форматы целых и вещественных чисел (стандарт 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)

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

2.3. Алгоритм получения дополнительного кода на примере числа −4510 (8 бит)

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

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

  1. Определить знак S: число отрицательное ⇒ S = 1.
  2. Перевести абсолютную величину 13,510 в двоичную дробь: Целая часть: 1310 = 8 + 4 + 1 = 11012.
    Дробная часть: 0,510 = 0,12.
    Итого двоичное представление: 1101,12.
  3. Нормализовать двоичное число: Сдвигаем двоичную запятую влево так, чтобы слева осталась ровно одна единица:
    1101,1₂ = 1,1011₂ × 2³
    Истинный порядок e = 3.
  4. Вычислить смещенный порядок E:
    E = e + 127 = 3 + 127 = 130₁₀ = 10000010₂
  5. Сформировать поле мантиссы (23 бита): Отбрасываем ведущую неявную единицу и двоичную точку (1.), берем значащие биты 1011 и дополняем нулями справа до 23 разрядов:
    M = 1011 0000 0000 0000 0000 000₂
  6. Собрать 32-битное слово и перевести в HEX:
      Бит 31: S = 1
      Биты 30..23: E = 10000010
      Биты 22..0:  M = 10110000000000000000000
      
      Двоичный вид: 1100 0001 0101 1000 0000 0000 0000 0000
      Шестнадцатеричный вид: 0xC1580000
Типичная ошибка: проблема неточного представления десятичных дробей. Числа вроде 0,110 или 0,210 не могут быть точно представлены конечной двоичной дробью (0,110 = 0,0001100110011…2 — бесконечная периодическая дробь). Поэтому сложение 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), редкие исторические письменности, специальные графические символы.
Аппаратные преимущества формата 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 × 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. Вопросы для самопроверки

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

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

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