Тема 2. Представление данных

При компьютерной обработке информации приходится иметь дело с текстовыми, графическими, числовыми, звуковыми и другими данными. Для хранения данных различной природы применяются различные способы их представления в двоичном алфавите – различные способы кодировки. Кроме того, для одной и той же разновидности данных также могут использоваться различные способы кодировки, которые отличаются друг от друга эффективностью и различными требованиями к ресурсам компьютера.

Конкретный способ кодирования той или иной разновидности информации в компьютере принято называть форматом данных.

В общем случае термин «формат» понимается как строго определенный, исчерпывающе полный набор правил. Следовательно, в приведенном ранее определении речь идет об исчерпывающем наборе правил кодирования в компьютере той или иной разновидности данных.

2.1 Тестовые данные.

При хранении в компьютере любой текст рассматривается как линейная последовательность символов. Каждому символу в последовательности ставится в соответствие конкретный двоичный код, состоящий ровно из восьми двоичных разрядов (одного байта).

Алфавит, используемый для представления текстов на естественном языке должен содержать как минимум 52 латинские буквы (строчные и прописные), десятичные цифры, знаки препинания, математические знаки, специальные знаки и т.д., всего примерно 150 символов. Исходы из теоретических соображений, это требует при равномерном алфавитном двоичном кодировании для представления любого знака исходного алфавита log2150 = 7,2, т.е. восьми двоичных цифр.

Списки всех используемых при записи текстов символов и однозначно соответствующих им двоичных кодов образуют так называемые кодовые таблицы. В практике программирования применяются различные кодовые таблицы. Одной из наиболее часто используемых является кодовая таблица ASCII (American Standard Code for Information Interchange – американский стандартный код для обмена информацией). В этой таблице зафиксированы коды для 128 различных символов. Их список и соответствующие им восьмиразрядные (то есть состоящие из восьми двоичных цифр, разрядов) двоичные коды образуют основную (базовую) кодовую таблицу ASCII. Но один байт может содержать 256 различных восьмиразрядных кодов. Это означает, что в стандарте ASCII задействована только половина возможностей 8-битного кодирования. Имеются различные расширения основной кодовой таблицы ASCII, в которых задаются коды еще для 128 символов, в том числе и для символов различных национальных алфавитов.

Если учесть все возможные буквы, входящие в национальные алфавиты различных стран, все возможные символы, которые встречаются в математических и других специальных текстах, то их общее количество окажется значительно больше 256 символов, кодирование которых обеспечивает один байт. Поэтому было разработано несколько десятков различных кодовых таблиц. При этом в разных кодовых таблицах один и тот же код может соответствовать разным символам.

Учитывая недостаточность возможностей обсуждавшихся кодовых таблиц, в последнее время все шире используется кодовая таблица UNICODE (UNIversal CODE – универсальный код), в которой для кода одного символа отводится два байта, а не один, как в рассмотренных ранее таблицах. С помощью двух байтов, то есть 16 битов, можно закодировать уже 216 = 65536 различных символов. Такого количества кодов вполне достаточно, чтобы представить большинство из встречающихся во всевозможных текстах символов.

Основные элементарные действия, которые должен уметь выполнять компьютер при обработке текстовых данных – сравнение кодов двух символов и замена одного кода другим.

2.2 Графические данные

Для рассмотрения общих принципов кодирования графических данных рассмотрим изображение на экране компьютера. Изображение состоит из некоторого количества горизонтальных линий (строк). Каждая строка состоит из элементарных точек – пикселов (PICture’S Element). Весь массив называют растром. Разрешающая способность (разрешение) – определяется количеством пикселей.

Строки, из которых состоит изображение, можно просматривать сверху вниз друг за другом. Такой способ работы с изображением называется строчной разверткой или сканированием. Таким образом, все изображение можно представить как линейную последовательность пикселов.

Рассмотрим принципы кодирования монохромного изображения (например, черно=белого). Каждый пиксел изображения может быть представлен либо «0», либо «1», а все изображение – двоичной последовательностью. Длина последовательности определяется разрешаюшей способностью. НапримерФ, при разрешающей способности 600 х 800, необходимое количество пикселов 480 000, которые могут быть закодированы при помощи 480 000 бит или 60 000 байт. Пример кодирования черно-белого изображения приведен на рис. 2.1.

Рис. 2.1. – Пример кодирования черно-белого изображения

Однако полученное таким образом изображение будет чрезмерно контрастным. Реальное черно-белое изображение состоит не только из белого и черного цветов. В него входит множество различных промежуточных оттенков – серый, светло-серый, темно-серый и т.д. Если кроме белого и черного цветов использовать только две дополнительные градации, скажем, светло-серый и темно-серый цвета, то чтобы закодировать цветовое состояние одного пиксела, потребуется уже два бита. При этом кодировка может быть, например, такой: черный цвет – 002, темно-серый – 012, светло-серый – 102, белый – 112 (рис. 2.2).

Рис. 2.2 – Вариант кодирования монохромного изображения

Общепринятым на сегодняшний день и дающим достаточно реалистичные монохромные изображения считается кодирования состояния одного пиксела с помощью восьми битов, то есть одного байта, которое позволяет передавать 256 различных оттенков серого цвета, от полностью белого до полностью черного. В этом случае для передачи всего растра из 800х600 пикселов потребуется уже не 60 000, а 480 000 байтов.

Цветное изображение может изображаться различными способами. Один из них – метод RGB (Red, Green, Blue), который опирается на то, что человек воспринимает все цвета как сумму трех основных цветов. В таком представлении для кодирования каждого пиксела надо минимум три бита, тогда количество различных цветов пиксела равно восьми. Если каждый из цветов кодировать с помощью байта, то можно передать 256 оттенков каждого цвета или 16 777 216 различных цветов. Такой способ принято называть True Color (точный цвет) или полноцветным режимом.

Полноцветный режим требует очень много памяти. Например, при разрешении экрана 600 х 800 метод RGB требует 1 440 000 байт, что соответствует 1,37 Мбайт. Отсюда возникает необходимость разработки различных режимов работы и графических форматов, которые позволяют сократить объем памяти.

Большинство действий, которые приходится выполнять над графическими данными в пиксельном формате, сводятся к замене текущего цвета пиксела другим цветом. Например, стирание какого-либо участка изображения – это не что иное как замена цветов всех пикселов стираемого участка цветом фона рисунка. Следовательно, и для графических данных элементарные действия, которые должен «уметь» выполнять компьютер, сводятся к сравнению двух двоичных кодов и замене одного кода другим.

2.3 Числовые данные

Вообще говоря, запись любого числа может рассматриваться как часть текста и в этом случае цифры – это обычные символы алфавита, для которых существенным являются только действия сравнения и замены.

Однако, в задачах обработки информации требуется выполнять различные математические операции над числами. Учитывая это принципиальное отличие, данные над которыми должны выполнятся математические преобразования, выделяют в особую группу числовых данных и для них применяются специальные способы кодирования.

2.3.1. Форматы представления чисел в компьютере

Для представления числовых данных в компьютерах используются два принципиально разных формата: формат с фиксированной точкой (запятой) и формат с плавающей точкой (запятой).

Формат с фиксированной точкой предназначен для абсолютно точного представления целых чисел. В программировании эти числа относятся к целому типу, в то время как формат с плавающей точкой используется для представления только нецелых, приближенных чисел. В программировании такие числа относятся к вещественному типу. Напомним, что вещественные числа возникают в задачах в результате различных измерений (например, измерений веса тела или его длины), которые, как известно, всегда выполняются с некоторой погрешностью, приближенно.

2.3.2. Форматы целых чисел

Существуют две модификации формата с фиксированной точкой, которые принято называть его беззнаковым и знаковым представлениями. Беззнаковое представление используется для работы с целыми неотрицательными числами, а существующее в нескольких вариантах знаковое – для работы как с положительными, так и с отрицательными числами

Беззнаковое представление формата с фиксированной точкоц

В беззнаковом представлении целого числа используется прямой двоичных код, который представляет собой запись этого числа в двоичной системе счисления. При этом все разряды занятого числом поля содержат его значащие цифры. Точка, отделяющая целую часть от дробной считается расположенной, фиксированной справа от крайнего правого разряда. Следовательно, под дробную часть числа отводится нулевое количество разрядов, и в данном варианте кодировки возможна работа только с целыми числами. Постоянное расположение, фиксация позиции точки дала название формату – с фиксированной точкой.

Для кодирования чисел в формате с фиксированной точкой используются поля длиной 1, 2 или 4 байта, поэтому N может быть равно 8, 16, 32. В таблице 2.1 приведены обычно используемые в программировании названия соответствующих этим полям целых типов и диапазоны их возможных значений.

Знаковые представления формата с фиксированной точкой

В истории развития архитектуры компьютеров использовались четыре различных варианта представления знаковых чисел:

1. Система со знаком;

2. Обратный код, поразрядное дополнение или код с дополнением до единицы;

3. Дополнительный, комплементарный код или код с дополнением до двух;

4. Система со смещением.

В настоящее время первые две системы устарели и практически вышли из употребления. Тем не менее по ходу изложения материала мы затронем и эти устаревшие системы.

Очевидно, что для машинного представления знаковых чисел нужно определенным образом закодировать знак числа и его модуль. Так как существует всего два знака чисел, «+» и «–», то самое простое напрашивающееся решение состоит в том, чтобы представить код знака одной двоичной цифрой и выделить под него один из разрядов поля, а во всех остальных разрядах записывать модуль числа, кодируя его, например, с помощью прямого двоичного кода, так же как кодируются беззнаковые целые числа. Такой способ называется системой кодирования со знаком. Код знака числа принято размещать в самом левом разряде поля, который в связи с этим принято называть знаковым битом. По традиции знак «плюс» кодируется нулем, а знак «минус» – единицей. Таким образом, если в знаковом бите находится нуль, это означает, что остальные биты поля содержат модуль положительного числа, а если знаковый бит занят единицей, то в них находится модуль отрицательного числа. Заметим, что можно было бы договориться и о другом способе кодирования знака, но по ряду причин выбран именно этот способ.

Обратите внимание на то, что в знаковом представлении различные биты кода играют различную роль, в то время как во всех рассматривавшихся ранее вариантах кодирования все цифры кода играют одну и ту же роль, например, образуют код отдельного символа текста или являются значащими цифрами беззнакового кода целого числа. Закрепление за разрядами поля конкретных функций хранения различных элементов кода принято называть разрядной сеткой.

Поскольку один из N битов поля отводится под знак числа, под запись кода модуля остается N-1 битов. Следовательно, в таком поле могут быть закодированы целые числа в диапазоне

Такое представление обладает следующими особенностями.

1. 010 соответсвует два кода 00…..0 (+010) и 10…0 (-010), что приводит к дополнительным аппаратным затратам при анализе кода.

2. Во-вторых, и это самое главное, возникает специальная арифметика с совершенно непривычными правилами выполнения самых обычных действий. Так по правилам обычной арифметики, сложение чисел +410 и -410 дает в результате 010. А теперь выполним сложение для полученных ранее кодов этих чисел: 000001002 + 100001002 = 100010002. Как видим, получен совершенно неожиданный результат: вместо ожидавшегося кода числа 010 сложение дало код числа -810. Этот результат является следствием неудачного выбора способа кодирования. Его нужно выбирать исходя из логики использования кода, а не из «напрашивающегося» или «очевидного» на первый взгляд подхода. Основное требование при выборе системы кодирования чисел состоит в том, что полученный код должен удовлетворять правилам выполнения сложения и вычитания в двоичной системе счисления. В связи с этим код каждого следующего положительного числа должен получаться прибавлением единицы к коду текущего числа, а код каждого следующего отрицательного числа должен получаться вычитанием единицы из кода текущего числа. Построенный таким образом код принято называть дополнительным, с дополнением до двух или комплементарным (от complementary – дополняющий).

Рис. 2.3 – Получение дополнительных кодов

Способ кодирования знаковых чисел, основанный на использовании дополнительного кода устраняет все отмеченные ранее недостатки применения системы кодирования со знаком. Во-первых, необходимые арифметические свойства удовлетворяются автоматически по способу построения кода. Например, при сложении кодов 01002 (+410) и 11002(–410) получается код 100002, старшая единица которого не помещается в используемые четыре разряда и отбрасывается. Таким образом, остается код 00002, который в точности соответствует нужному результату. Отметим, что это общий технический прием при выполнении действий со знаковыми числами. Он аналогичен приему, использованному в рассуждениях при получении дополнительного кода числа –1. Можно считать, что во время выполнения аналогичных операций возвращается заем, выполненный ранее из воображаемого дополнительного разряда.

Во-вторых, исчезла неоднозначность кодирования нуля. В самом деле, код 10002, который раньше вместе с кодом 00002 использовался для кодирования нуля, оказался закрепленным за кодом максимального по модулю отрицательного числа -810. Это привело к тому, что диапазоны представления положительных и отрицательных чисел стали несимметричными. В самом деле, если для записи кода используется только 4 бита, то при выборе любого способа кодирования возможно формирование

всего 24 = 16 различных кодов. Из них при применении системы со знаком 14 кодов закреплено за ненулевыми числами из симметричного диапазона от ‑710 до +710, и еще два кода, 00002 и 10002, соответствуют нулю. Применение дополнительного кода позволяет изобразить шестнадцать целых чисел (вместе с нулем) из несимметричного диапазона от -810 до +710. При этом под нуль занят всего один код 00002, а закрепление кода 10002 за числом -810 как раз и приводит к появлению несимметричности диапазона.

При использовании дополнительного кода в поле длиной N бит можно закодировать числа в диапазоне

Получение дополнительного кода целых чисел.

1. Прямой код записывается в выбранное поле длиной 1, 2 или 4 байта.

2. Прямой код инвертируется (обращается), то есть каждая цифра 1 кода заменяется цифрой 0. Заметим, что полученный таким образом код называется обратным, с дополнением до единицы или с поразрядным дополнением. К обратному коду прибавляется единица.

В заключение кратко обсудим систему кодирования со смещением, которая в англоязычной литературе называется системой excess 2N – 1. Эта система кодирования характеризуется целым положительным числом – константой смещения K, которое (смещение) прибавляется к любому кодируемому числу х с тем, чтобы сумма исходного числа и константы смещения х + K попала в диапазон допустимых для поля выбранной длины N беззнаковых чисел : x + K ∈ . В качестве кода исходного числа выбирается беззнаковый код суммы. Таким образом, множество кодируемых чисел в системе с константой смещения K есть = {x ∉ Z| – K ≤ x ≤ 2N – K – 1}. Пусть, например, N = 8 и K = 64. Тогда = {x ∉ Z| – 64 ≤ x ≤ 191}, а код, например, числа х = -410 определяется как беззнаковый код числа 6010, равный 0011 11002 или 3С16. Диапазон, включающий числа разного знака, с помощью константы K смещается как единое целое вдоль числовой оси в конечное положение, совпадающее с диапазоном беззнакового кодирования.

Если взять специальный случай, когда константа K = 2N, где N – длина поля в битах, то окажется, что система с таким смещением весьма близка к дополнительному коду. Возьмем, например N = 8, тогда K = 128 и = {x ∉ Z| – 128 ≤ x ≤ 127}. Как можно заметить, в данном случае диапазоны системы со смещением и дополнительного кода совпадают. Практически одинаковы и получаемые при этом коды чисел. Например, в качестве кода числа -4 в этой системе выбирается беззнаковый код числа 12410, равный 0111 11002 или 7С16. Если сравнить полученный результат с дополнительным кодом 1111 11002 того же самого числа -4, то легко увидеть, что они различаются только в знаковом бите. Другими словами, код числа в системе со смещением с константой K = 2N совпадает с дополнительным кодом, у которого инвертирован знаковый бит.

Как мы увидим в дальнейшем, в настоящее время система кодирования со смещением используется как один из элементов представления чисел в формате с плавающей точкой.

Ранее отмечалось, что устройство, осуществляющее арифметические операции над числами в двоичной системе счисления, должно обеспечивать выполнение действий сложения, вычитания и сдвига, так как умножение и деление сводятся именно к этим операциям. В связи с тем, что вычитание всегда можно заменить сложением с отрицательным числом, становится понятно, что процессоры компьютеров могут «обойтись» и без операции вычитания. Для обработки целочисленных данных им достаточно «уметь» выполнять сложение и сдвиги для двоичных кодов.

2.3.3 Формат вещественных чисел

Обычно используемая запись числа в виде ±a, b, содержащем целую (а) и дробную (b) части, считается основной формой записи вещественных чисел. В естественных науках довольно часто вместо основной формы числа используется его запись в виде произведения двух сомножителей, один из которых является основанием системы счисления в некоторой степени, например: 2,9 ∙ 1018 или 0,91 ∙ 10-31. Чаще всего такая запись используется во время работы с очень большими или очень маленькими по модулю числами. При этом достигается значительная экономия во времени, наглядности, в простоте восприятия содержащего такие числа текста. Сравните, например, способы записи одного и того же числа: 2 900 000 000 000 000 000 и 2,9 ∙ 1018, а также 0,000000000000000000000000000000091 и 0,091 ∙ 10-30.

Запись вида ±m×p±q называется формой с порядком или экспоненциальной формой вещественного числа. Некоторые авторы используют также название полулогарифмическая форма. Сомножитель m принято называть мантиссой, а степень ±q, в которую возводится основание p системы счисления, – порядком числа. Так, для числа 2,9 ∙ 1018 мантисса m = 2,9, основание p = 10, а порядок q = 18.

Нормализованные числа

Обсуждаемая форма представлени чисел не дает однозначной записи одного и того же числа. Например

1234,5 =123,45 ∙101=12,345∙102=1,2345∙103 ….

Чтобы избавиться от указанной неоднозначности, на значение мантиссы m накладывают какое-либо ограничение, например, 0,1 ≤ m < 1 или 1 ≤ m < 10. Отметим, что в стандартах последнего времени закрепилось использование ограничения 1 ≤ m < 10, которое в случае двоичной системы счисления означает, что целая часть мантиссы всегда должна быть равна единице.

Выполнение операций над нормализованными числами

Операций на числами в основной форме выполняются поразрядно. При представлении числа в нормализованном виде так делать нельзя, т.к. «вес» одно и того же разряда мантиссы зависит от величины порядка числа.

Поэтому перед выполнением операции производят выравнивание порядков, т.е. производится процедура приведения чисел к одинаковому порядку. Это делается при помощи денормализации числа с меньшим порядком. Для этого порядок числа увеличивается на единицу, а мантисса уменьшается в десять раз. Так выполняется до тех пор, пока порядки чисел не станут равными.

1,23456=0,123456∙101=0,0123456∙102=0,0123456∙103=….

После выполнения действия результат может быть ненормализованным. В этом случае, следует выполнить процедуру нормализации числа.

Обнаруженное усложнение выполнения действий над нормализованными числами является платой за возможность работать с числами из гораздо более широкого диапазона, чем в формате с фиксированной точкой. Заметим также, что используемый для представления вещественных чисел формат с плавающей точкой получил свое название в связи с необходимостью перемещать во время выполнения арифметических операций текущее положение точки (запятой), отделяющей целую часть числа от дробной.

Общие принципы кодирования чисел в формате с плавающей точкой

Для кодирования вещественных чисел в формате с плавающей точкой используется их нормализованная форма ±m×p±q, 1 ≤ m < 10. Анализ этой формы показывает, что в системе счисления с заданным основанием p код нормализованного числа должен содержать:

1. Код знака числа;

2. Код нормализованной мантиссы 1 ≤ m < 10;

3. Код знака порядка;

4. Код порядка p.

В ранний период развития вычислительной техники разные разработчики компьютеров использовали различные аппаратные реализации формата с плавающей точкой. Его техническая реализация имеет много тонкостей, связанных с реакцией процессора на возникающие во время вычислений ситуации исчезновения порядка и переполнения. Неаккуратный подход к реализации иногда приводил к возникновению грубых ошибок в вычислениях. Кроме того, различные представления формата с плавающей точкой препятствовали переносу программ с компьютеров одной модели на компьютеры других моделей. Такой разнобой продолжался до начала 1980-х гг., когда одной из комиссий IEEE (Institute of Electrical and Electronics Engineers – Международный институт инженеров по электротехнике и электронике) было поручено создание стандарта для реализации формата с плавающей точкой. В результате был создан стандарт на представление формата с плавающей точкой в компьютерах, который под номером IEEE 754 бы принят в 1985 г. в качестве международного. В настоящее время процессоры основных мировых разработчиков (Intel, SPARC, Power и т.д.) придерживаются этого стандарта.

Стандарт IEEE 754 предусматривает, что двоичные коды чисел в формате с плавающей точкой могут занимать поля длиной 4, 8 и 10 байтов. В соответствии с общими принципами кодирования чисел в этом формате поля содержат код знака числа, код порядка и его знака, а также код мантиссы.

Код знака числа как всегда занимает один, самый левый разряд поля. Кодируется знак также стандартным образом: 0 для положительных чисел и 1 – для отрицательных. Разработчики стандарта предложили использовать для кодирования порядка со знаком систему со смещением, константа которой равна K = 2N-1 – 1, где N – количество разрядов поля, выделенных под хранение порядка и его знака. Если истинный порядок нормализованного числа равен Pн, то в указанных битах поля записывается прямой двоичных (беззнаковый) код суммы Рм = Рн + К, который принято называть машинным порядком исходного вещественного числа. Количество разрядов N, которое выделяется под машинный порядок равно 8, 11 и 15 для 4-, 8- и 10-байтовых полей соответственно. Таким образом, в обсуждаемом стандарте минимально возможный N-битовый машинный порядок у обычных чисел – 000…012, а максимально возможный – 111...102. Более подробно это вопрос обсуждается далее.

Оставшиеся от знакового бита и кода порядка разряды полей отводятся под код мантиссы, который, таким образом, занимает 23, 52 и 64 бита для 4-, 8- и 10-байтовых полей соответственно. В стандарте IEEE 754 мантисса всегда считается нормализованной, за исключением уже упоминавшихся специальных значений, которые имеют порядки 000…002 и 111…112. Но у нормализованной мантиссы в двоичной системе счисления целая часть всегда равна единице. Поэтому разработчики стандарта предложили при хранении числа эту всегда равную единице целую часть не указывать в разрядной сетке поля. При хранении кодов чисел она только подразумевается, но во время выполнения действий целая часть автоматически восстанавливается. С помощью этого приема обеспечивается увеличение точности дробной части мантиссы, так как сэкономленный на неявно задаваемой целой части разряд отводится под дополнительную цифру дробной части мантиссы.

Имеется три формата с плавающей точкой (одинарной точности ОТ, двойной точности ДТ, расширенной точности РТ). Значащие числа находятся в поле мантиссы, поле порядка показывает фактическое положение десятичной точки в разрядах мантиссы, а бит знака определяет знак числа (рис. 2.4).

|  |  | 7 0 | 23 | 0 |  |  |  |  |
32 р. | ОТ | S | E | M |  | M=24 | E=8 | E=+127; -126 | Cм=127
|  |  | 10 | 0 | 52 | 0 |  |  |  |
64 р. | ДТ | S | E | M | M=53 | E=11 | E=+1023;-1022 | Cм=1023
|  |  | 14 | 0 | 63 |  | 0 |  |  |  |
80 р. | РТ | S | E | 1 | M | М=64 | Е=15 | Е=+16383;-16382 | См=16383

Рис. 2.4

Порядок E задается в смещенной форме, он равен истинному порядку, увеличенному на значение смещения.

E = истинный порядок + смещение.

Значение числа с плавающей точкой равно:

(-1)S•2E-смещение•(F0).(F1)(F2) …(Fn),

где n = 23, 52, 63.

Устройство FPU обычно поддерживает представление мантиссы в нормализованной форме, т.е. старший бит равен 1. Следовательно, за исключением числа нуль мантисса состоит из целой части и дроби в следующем виде: 1.(F1)(F2)(F3) … (Fn), где Fi = 0 или 1.

В форматах ОТ и ДТ бит F0 при передаче чисел и хранении их в памяти не фигурирует. Это т.н. скрытый и неявный бит, который содержит 1. Следовательно, в этих форматах невозможно представить ненормализованные числа (за некоторым исключением). Кроме того, скрытый бит не позволяет представить в этих форматах нуль, и он должен кодироваться как специальное значение.

Числа в формате РТ имеют явный бит F0. Напомним, что внутри FPU числа хранятся только в этом формате. Перевод в другие форматы из них осуществляется автоматически.

В качестве примера рассмотрим представление числа –247.375 в вещественных форматах FPU.

-247.375 =>-11110111.011

Определяем истинный порядок. Он равен –7.

Смещенный порядок:

· для обычной точности: 7+127=134 è 1000 0110

· для двойной точности: 7+1023=1030 è100 0000 0110

· для расширенной точности: 7+16383=16390 è 100 0000 0000 0110.

Значения чисел:

· ОТ: 1 1000 0110 1110 1110 0110 00 ….00

· ДТ: 1 100 0000 0110 1110 1110 0110 00 ….00

· РТ:1 110 0000 0000 0110 1111 0111 0011 00…00.

Специальные значения. Форматы чисел допускают представление специальных объектов и значений. Для их представления зарезервированы значения смещенного порядка 000 … 0 и 111 … 1.

Сравнивая логику вычислений с данными, представленными в формате с фиксированной точкой, и логику выполнения действий над данными в формате с плавающей точкой, несложно заметить существенно более сложный характер вычислений с плавающей точкой. В последнем случае необходимо, по крайней мере, уметь выделять одиночные биты и некоторые группы битов – участки полей, которые соответствуют кодам порядка и мантиссы. Дальнейшая раздельная обработка этих кодов уже близка к действиям над целочисленными данными. Для выделения некоторых групп битов процессор должен в дополнение к вышеперечисленным операциям сравнения, сложения и сдвига «уметь» выполнять над двоичными кодами такие операции, как дизъюнкция, конъюнкция и отрицание.

Минимальный набор действий, которыми владеть процессор компьютера, включает операции сравнения, сложения, дизъюнкции и конъюнкции, а также пересылки, отрицания и сдвига одиночного кода на некоторое количество разрядов вправо и влево.

2.3.4 Особенности компьютерной арифметики

Завершая обсуждение принципов кодирования числовой информации, необходимо особо подчеркнуть, что, несмотря на используемые в современных компьютерах изощренные приемы кодирования, достичь полного соответствия между обычно арифметикой и компьютерной обработкой числовых данных принципиально невозможно. Этот вывод является следствием того, что в любом случае код числа в памяти компьютера, представляющего собой реальное техническое устройство, занимает конечное количество разрядов поля. Это количество теоретически можно сделать сколь угодно большим, но оно принципиально не может быть бесконечным, в то время как в математике числа в общем случае изображаются бесконечным количеством значащих цифр.

Конечность количество разрядов поля, используемого для записи кода числа, приводит, во-первых, к ограниченности диапазонов кодируемых целых и вещественных чисел, а во-вторых, к конечной точности представления вещественных чисел. Если результат выполнения некоторой операции над данными с фиксированной точкой выйдет за границы диапазона представимых в данном поле чисел, то либо лишние биты окажутся утерянными, либо будет сформировано сообщение о возникновении ошибки и вычисления будут остановлены. Если для представления чисел используется формат с плавающей точкой, то результат может быть заменен машинным нулем или бесконечностью. В этом случае в зависимости от конкретной ситуации дальнейшие вычисления могут вернуть приемлемый приближенный результат либо так же, как и в предыдущем случае, может быть сформировано сообщение об ошибке с прекращением вычислений.

Пример нарушения ассоциативного закона в компьютерной арифметике рассматривался ранее. В точки зрения обычной арифметики, значение выражения (y – x) + x всегда одно и то же и равно у, в то время как получаемый на компьютере результат существенно зависит от значений величин x и у, от используемого формата кодирования – с фиксированной или с плавающей точкой, а если используется формат с плавающей точкой, то и от реализованной в компьютере реакции на исчезновение порядка.

Теперь рассмотрим пример нарушения дистрибутивного закона. Пусть требуется вычислить значение выражения (x + y)z. Если значения х и у велики, то их суммирование может вызвать переполнение, и тогда результат не будет получен вообще или же он может трактоваться как бесконечно большой. С другой стороны, если сомножитель z мал и выражение реализовано в эквивалентном с точки зрения обычной арифметики виде xz + yz, то велика вероятность того, что вычисления вернут правильный результат. Итак, мы опять сталкиваемся с ситуацией, когда эквивалентные с точки зрения обычной математики выражения в компьютерном варианте вычислений могут иметь разные значения.

Известно, что на числовой прямой любой отрезок или интервал содержит несчетное множество действительных чисел, в то время как любое поле для представления чисел в формате с плавающей точкой всегда может быть использовано для записи лишь конечного количества различных кодов. Это влечет за собой следующую особенность, связанную с отсутствием свойства плотности у множества чисел с плавающей точкой. Свойство плотности множества действительных чисел состоит в том, что для любых двух действительных чисел α и β существует число χ – такое, что α < χ < β. В компьютерной математике из-за отсутствия этого свойства между двумя кодами не всегда можно найти код, обладающий таким свойством. И если в результате вычислений получается не представимое в разрядной сетке число, то его приходится округлять в ту или иную сторону. Соответственно на результат начинает влиять выбранный в компьютере способ округления, и при определенных обстоятельствах ошибки округления могут накапливаться, существенно корректируя окончательный результат.

2.4. Аудио- и видеоданные

Развитие способов кодирования звуковой информации, а также движущихся изображений – анимации и видеозаписей – происходило с запаздыванием относительно способов кодирования рассмотренных выше разновидностей информации. Приемлемые способы хранения и воспроизведения с помощью компьютера звуковых и видеозаписей появились только в 1990-х годах. Эти способы работы со звуком и видео получили название мультимедийных технологий.

Звук представляет собой довольно сложное, непрерывное колебание воздуха. Основной подход к кодированию звука, который называется преобрзованием в цифровую форму, оцифровыванием или дискретизацией, основан на том, что непрерывный звуковой сигнал заменяется дискретным (то есть состоящим из обособленных, раздельных элементов) набором значений сигнала – отсчетов сигнала – в некоторые последовательные моменты времени (рис. 2.5). Каждый отсчет кодируется в одном из рассмотренных ранее числовых форматов. Таким образом, кодирование и обработка звуковых данных фактически сводятся к кодированию и обработке числовых данных.

В соответствии с этим определением количество отсчетов сигнала в единицу времени называется частотой дискретизации. Так, на рис. 2.5 сигнал, длящийся 2 с, заменяется 100 отсчетами (жирные точки на графике амплитуды сигнала). Следовательно, в данном случае частота дискретизации равна 50 Гц. При записи звука в мультимедийных технологиях применяются частоты 8, 11, 22 и 44 кГц. Частота дискретизации 44 кГц означает, что одна секунда непрерывного звучания заменяется набором из сорока четырех тысяч отдельных отсчетов сигнала. Чем выше частота дискретизации, тем лучше качество оцифрованного звука. В последних разработках частота дискретизации достигает 192 кГц.

Рис. 2.5

Каждый отдельный отсчет представляет собой число, которое затем можно представить в виде некоторого двоичного кода. Качество преобразования звука в цифровую форму определяется не только частотой дискретизации, но и количеством битов памяти, отводимых на запись кода одного отсчета. Этот параметр принято называть разрядностью преобразования. В настоящее время обычно используются разрядности 8, 16, 24 бит. На описанных принципах основывается формат WAV (от WAVeform-audio – волновая форма аудио) кодирования звука.

Кодирование видеоинформации – еще более сложная проблема, чем кодирование звуковой информации, так как нужно позаботиться не только о дискретизации непрерывных движений, но и о синхронизации изображения со звуковым сопровождением. В настоящее время для этого используется формат, который называется AVI (Audio-Video Interleaved – чередующиеся аудио и видео). Отметим, что основные мультимедийные форматы AVI и WAV очень требовательны к памяти. Поэтому на практике применяются различные способы компрессии (сжатия) звуковых и видеокодов.

2.5 Принцип обезличивания кода.

Для компьютера не существует разницы между кодами данных различной природы. Интерпретация (истолкование смысла) машинного кода может быть самой разной. Один и тот же код разыми программами может рассматриваться и как число, и как текст, и как изображение, и как звук. Другими словами, как именно трактуется, понимается тот или иной машинный код, определяется обрабатывающей этот код программой.

Принцип обезличивания машинного кода состоит в том, что один и тот же код может восприниматься процессором компьютера в любом из используемых в аппаратных и программных средствах способов кодирования. Конкретная трактовка кода определяется обращающейся к коду программой.

2.6 Надежность кодирования

Одним из важнейших аспектов организации храения и передачи кодов данных является обеспечение их надежности и безошибочности. Существует множество различных факторов, воздействие которых на аппаратные средства компьютера приводит к искажению кодов данных. К ним относятся, например, влияние сильных электромагнитных полей от источников, находящихся вблизи запоминающих, передающих устройств и линий связи, влияние температурного расширения материалов, из которых состоят запоминающие устройства, сбои в работе аппаратуры, механические удар и т.д. Для защиты данных от большинства таких факторов к настоящему времени уже разработан и внедрены достаточно надежные средства.

Вместе с тем, применяя специальные методы кодирования, можно обеспечить контроль за появлением ошибки и даже восстановление исходного кода после ее обнаружения. Применение этих методов позволяет снизить вероятность ошибки до 10-9 и ниже.

Общим методом обеспечения надежности храения и передчи данных в компьютере и по линиям связи является включение в код дополнительных контрольных разрядов (битов). Существует много различных вариантов этого метода.

Во многих компьютерах одним из уровней контроля за появлением ошибок является включение в байт дополнительного, контрольного девятого разряда, который формируется аппаратурой автоматически. А те восемь битов, из которых, как мы до сих пор считали, состоит байт, в дальнейшем будем называть информационными. Значение контрольного разряда определяется так, чтобы общее количество разрядов байта (всех информационных и контрольного), которые содержат 1, было нечетным. Рассмотрим, например, байт с информационными битами 1001 11102. Количество единиц в нем нечетно, следовательно, аппаратура сформирует значение контрольного бита, равное 0. При этом общее количество единиц в девяти битах байта останется нечетным. А, например, для байта с информационными битами 1001 01102, количество единиц в котором четное, контрольный бит окажется равным 1 – в результате образуется нужное нечетное количество единиц.

Кроме введения контрольного разряда существуют и более развитые способы кодирования, которые не только позволяют установить факт появления ошибок большой кратности, но и обеспечивают их исправление. К таким способам относятся коды, принцип построения которых в 1948 г. предложил Р. Хемминг.

Теперь рассмотрим предложенный Р. Хеммингом общий порядок построения кодов, обеспечивающий однозначное обнаружение и исправление ошибок в кодах данных. Он включает в себя следующие действия.

1. Контрольные биты вставляются в исходный код и нумеруются совместно с информационными битами слева направо начиная с 1.

2. Контрольные биты располагаются в позициях с номерами n = 2k, k = 0, 1, 2, 3… объединенного кода, то есть в позициях с номерами n = 1, 2, 4, 8, 16 …

3. Для каждого контрольного разряда с номером n весь код делится на группы, состоящие из 2n битов.

4. Контрольный бит с номером n контролирует в группе первые n подряд расположенных битов кода (для первой группы, включая контрольный) с пропуском следующих n битов.

5. В каждой группе контрольный бит формируется так, чтобы общее количество единиц в ней было нечетным.

Рис. 2.6

Для определения ошибочного бита важно знать не какие информационные биты относятся к данному контрольному, а какие контрольные биты закреплены за данным информационным. Анализ показывает, что в общем случае информационный бит с номером b проверяется контрольными битами с номерами b1, b2 … bk, такими, что b = b1 + b2 + … + bk. Это значит, что номер ошибочного бита равен сумме номеров контрольных битов, обнаруживших ошибку.

Методы построения кодов Хемминга и некоторых других, более мощных способов кодирования, используются в различных устройствах памяти компьютера. В частности, на этих методах основан аппаратных механизм контроля оперативной памяти ECC (Error Checking and Correcting – контроль и исправление ошибок), который является дополнительным средством обеспечения высокой ее помехоустойчивости.