В какой форме данные и программа представляются в памяти эвм
Представление данных в памяти ЭВМ — это представление данных в форме битового набора, то есть комбинации нулей и единиц.
Введение
Сутью информационной обработки в электронной вычислительной машине (ЭВМ) является взаимодействие начальных (исходных) данных, являющихся операндами, и командного потока, заложенного в программе, для получения на выходе потока итоговых результатов. Процесс взаимодействия операндов и команд в компьютере состоит из процедур их сохранения, выборки для выполнения, непосредственно исполнение операции взаимодействия и далее хранение результатов, которые могут быть промежуточными или итоговыми.
Сохранение и информационная выборка должны предполагать некоторый описанный способ обращения к командам и операндам, и, следовательно, использование адресной информации, то есть, кодов адреса, признаков поиска и так далее. Сама ЭВМ, её внутренние модули и подсистемы, а также режимы их функционирования должны быть идентифицированы и, следовательно, должна быть предоставлена информация о текущем состоянии модулей (в виде кодов) и режимах их работы. Коды состояний и адресные данные формируют внутренние потоки операндов.
Представление данных в памяти ЭВМ
Основными типами операндов, являющихся информационными единицами, являются следующие типы:
- Операнды числового типа.
- Операнды символьного типа, то есть коды символов.
- Операнды логического типа.
К дополнительным типам операндов относятся следующие типы:
- Операнды, являющиеся битовыми полями.
- Операнды, являющиеся битовыми и байтовыми строками.
- Операнды, являющиеся символьными (тестовыми) строками.
- Операнды, являющиеся адресами (кодами адресов) и дескрипторами-указателями.
- Операнды, представляющие собой коды состояний и коды команд.
К производным типам операндов, которые являются информационными единицами, относятся следующие:
- Операнды, являющиеся массивами данных (различных кодов).
- Операнды, являющиеся файлами с графическими изображениями, аудио- и видеоинформацией.
Каждый из типов операндов в ЭВМ может существовать в конкретном формате, а именно, в стандартном или нестандартном формате.
Стандартными числовыми форматами являются следующие:
- Формат чисел с фиксированной запятой.
- Формат чисел с плавающей запятой.
- Логический формат.
Готовые работы на аналогичную тему
В свою очередь числа с фиксированной запятой делятся на:
- Целые числа с разными основаниями системы счисления, а именно, с основанием два (q=2), и реже с основанием восемь и шестнадцать. Кроме того, они могут иметь знак и не иметь его, а также быть двоично-десятичными в различных кодах.
- Дробные числа.
- Смешанные числа.
Нестандартными форматами чисел являются:
- Форматы чисел в недвоичной системе счисления, к примеру, в троичной.
- Формат чисел, имеющих переменные основания, а также имеющих иррациональные основания.
- Формат чисел в непозиционной системе счисления.
- Логарифмический формат чисел.
- Другие форматы.
Базовыми в сегодняшних ЭВМ считаются целочисленные форматы, имеющие знак и без него, которые являются кратными байту. То есть это 16-ти разрядное слово, 32-х разрядное двойное слово и 64-х разрядное четверное слово.
Форматы смешанного и дробного типа сегодня практически не используются или встречаются очень редко. Также почти не используется модифицированная форма представления числа со знаком и представление отрицательного числа в обратном коде.
Формат чисел без знака подразумевает, что все операнды, являющиеся числами, не могут иметь отрицательные значения. При осуществлении действий с такими числами особое внимание уделяется признакам переполнения разрядной сетки.
Использование целых чисел, которые обычно упакованы, сопряжено с обработкой мультимедийных данных. Команды выполняют обработку всех этих чисел в параллельном режиме.
Использование целых двоично-десятичных чисел сопряжено, как правило, с проблемами бухгалтерии и статистики. В этом случае применяется метод кодирования всех десятичных цифр при помощи эквивалентного двоичного числа, состоящего из четырёх битов, то есть двоично десятичным кодом. Как правило, применяется стандартный метод кодирования 8,4,2,1, где цифры являются весами разрядов. Остальные комбинации используются для отображения знаков и допустимых служебных символов.
Основным недостатком применения чисел в формате с фиксированной запятой считается ограниченный диапазон отображения чисел в разрядной сетке, и, как следствие, появляется вероятность переполнения разрядной сетки. Это требует использования операции масштабирования.
Этой проблемы нет в «нормальном» формате представления чисел, то есть, число делится на два набора цифр, а именно, мантиссу и порядок. Таким образом, число А можно представить следующей формулой:
- $M_A$ является модулем мантиссы.
- $P_a$ является модулем порядка числа $A$.
- $d$ является основанием характеристики.
Из данной формулы вытекает, что если изменяется модуль мантиссы, то меняется и модуль порядка, что и считается «плаванием» запятой. Это и определило имя формата.
В сегодняшних ЭВМ, чтобы упростить операции связанные с порядком числа, их приводят к формату целого положительного числа, используя специальный смещённый порядок. То есть, к фактическому порядку числа прибавляется целое положительное число, именуемое смещением, которое следует выбрать равным половине представимого диапазона порядков. Смещённый порядок должен занимать все биты в поле порядка, включая и тот, который был предназначен для занесения знака порядка.
Как правило, разрядность ячеек памяти ЭВМ равняется одному байту, а фактическая длина кодов чисел может составлять один, два, четыре, восемь или шестнадцать байтов. При сохранении таких числовых данных в памяти их байты помещаются в набор ячеек, имеющих смежные адреса. Причём чтобы получить доступ к этому числу, следует указать лишь самый маленький из набора адрес.
Для представления информации в памяти ЭВМ (как числовой так и не числовой) используется двоичный способ кодирования.
Элементарная ячейка памяти ЭВМ имеет длину 8 бит (1 байт). Каждый байт имеет свой номер (его называют адресом). Наибольшую последовательность бит, которую ЭВМ может обрабатывать как единое целое, называют машинным словом. Длина машинного слова зависит от разрядности процессора и может быть равной 16, 32 битам и т.д.
Для кодирования символов достаточно одного байта. При этом можно представить 256 символов (с десятичными кодами от 0 до 255). Набор символов персональных компьютеров чаще всего является расширением кода ASCII (American Standart Code of Information Interchange - стандартный американский код для обмена информацией).
Другой способ представления целых чисел - дополнительный код . Диапазон значений величин зависит от количества бит памяти отведенных для их хранения. Например, величины типа Integer лежат в диапазоне от
-32768 (-2 15 ) до 32677 (2 15 -1) и для их хранения отводится 2 байта: типа LongInt - в диапазоне от -2 31 до 2 31 -1 и размещаются в 4 байтах: типа Word - в диапазоне от 0 до 65535 (2 16 -1) используется 2 байта и т.д.
Как видно из примеров, данные могут быть интерпретированы как числа со знаком, так и без знаков. В случае представления величины со знаком самый левый (старший) разряд указывает на положительное число, если содержит нуль, и на отрицательное, если - единицу.
Вообще, разряды нумеруются справа налево, начиная с нуля.
Дополнительный код положительного числа совпадает с его прямым кодом . Прямой код целого числа может быть представлен следующим образом: число переводиться в двоичную систему счисления, а затем его двоичную запись слева дополняют таким количеством незначащих нулей, сколько требует тип данных, к которому принадлежит число. Например, если число 37(10) = 100101(2) объявлено величиной типа Integer, то его прямым кодом будет 0000000000100101, а если величиной типа LongInt, то его прямой код будет 00000000000000000000000000100101. Для более компактной записи чаще используют шестнадцатеричный код. Полученные коды можно переписать соответственно как 0025(16) и 00000025(16).
- записать прямой код модуля числа;
- инвертировать его (заменить единицы нулями, нули - единицами);
- прибавить к инверсионному коду единицу.
- прямой код числа 37 есть 000000000000000000000000000100101
- инверсный код 11111111111111111111111111011010
- дополнительный код 11111111111111111111111111011011 или FFFFFFDB(16)
- вычесть из кода 1;
- инвертировать код;
- перевести в десятичную систему счисления. Полученное число записать со знаком минус.
Примеры. Запишем числа, соответствующие дополнительным кодам:
Поскольку в старшем разряде записан нуль, то результат будет положительным. Это код числа 23.
Здесь записан код отрицательного числа, исполняем алгоритм:
- 1111111111000000(2) - 1(2) = 1111111110111111(2);
- 0000000001000000;
- 1000000(2) = 64(10)
Несколько иной способ применяется для представления в памяти персонального компьютера действительных чисел. Рассмотрим представление величин с плавающей точкой .
Персональный компьютер IBM PC с математическим сопроцессором 8087 позволяет работать со следующими действительными типами (диапазон значений указан по абсолютной величине):
Тип | Диапазон | Мантисса | Байты |
Real | 2,9*10 -39 ..1,7*10 38 | 11-12 | 6 |
Single | 1,5*10 -45 ..3,4*10 38 | 7-8 | 4 |
Double | 5,0*10 -324 ..1,7*10 308 | 15-16 | 8 |
Extended | 3,4*10 -4932 ..1,1*10 4932 | 19-20 | 10 |
Покажем преобразование действительного числа для представления его в памяти ЭВМ на примере величины типа Double.
Как видно из таблицы, величина этого типа занимает в памяти 8 байт. На рисунке показано, как здесь представлены поля мантиссы и порядка:
S | Смещенный порядок | Мантисса |
63 | 52 | 0 |
Можно заметить, что старший бит, отведенный под мантиссу, имеет номер 51, т.е. мантисса занимает младшие 52 бита. Черта указывает здесь на положение двоичной запятой. Перед запятой должен стоять бит целой части мантиссы, но поскольку она всегда равна единице, здесь данный бит не требуется и соответствующий разряд отсутствует в памяти (но он подразумевается). Значение порядка храниться здесь не как целое число, представленное в дополнительном коде. Для упрощения вычислений и сравнения действительных чисел значение порядка в ЭВМ хранится в виде смещенного числа , т.е. к настоящему значению порядка, перед записью его в память, прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. Например, для типа Double порядок занимает 11 бит и имеет диапазон от 2 -1023 до 2 1023 , поэтому смещение равно 1023(10) = 1111111111(2). Наконец, бит с номером 63 указывает на знак числа.
- перевести модуль данного числа в двоичную систему счисления;
- нормализовать двоичное число, т.е. записать в виде М*2 p , где М - мантисса (ее целая часть равна 1(2)) и р - порядок, записанный в десятичной системе счисления;
- прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;
- учитывая знак заданного числа (0 - положительное; 1 - отрицательное), выписать его представление в памяти ЭВМ.
- Двоичная запись модуля этого числа имеет вид 100111000,0101.
- Имеем 100111000,0101 = 1,001110000101*2 8 .
- Получаем смещенный порядок 8 + 1023 = 1031. Далее имеем 1031(10) = 10000000111(2).
- Окончательно
1 10000000111 0011100001010000000000000000000000000000000000000000 63 52 0
Очевидно, что более компактнополученный код стоит записать следующим образом: C073850000000000(16).
Другой пример иллюстрирует обратный переход от кода действительного числа к самому числу.
Пусть дан код 3FEC600000000000(16) или
0 | 01111111110 | 1100011000000000000000000000000000000000000000000000 |
63 | 52 | 0 |
- Прежде всего, замечаем, что это код положительного числа, поскольку в разряде с номером 63 записан нуль, Получим порядок этого числа. 01111111110(2) = 1022(10). 1022 - 1023 = -1.
- Число имеет вид 1,1100011*2 -1 или 0,11100011.
- Переводом в десятичную систему счисления получаем 0,88671875.
Мы рассмотрели виды представления информации в памяти ЭВМ, теперь можно приступить к проверке знаний.
Представление числовых данных в памяти ЭВМ
Для представления информации в памяти ЭВМ (как числовой, так и не числовой) используется двоичный способ кодирования.
Элементарная ячейка памяти ЭВМ имеет длину 8 бит (байт). Каждый байт имеет свой номер (его называют адресом ). Наибольшую последовательность бит, которую ЭВМ может обрабатывать как единое целое, называют машинным словом . Длина машинного слова зависит от разрядности процессора и может быть равной 16, 32, 64 битам и т.д.
Кодирование символов
Для кодирования символов достаточно одного байта. При этом можно представить 256 символов (с десятичными кодами от 0 до 255). Набор символов персональных ЭВМ, совместимых с IBM PC, чаще всего является расширением кода ASCII (American Standard Code for Information Interchange стандартный американский код для обмена информацией). В настоящее время используются и двухбайтовые предсталения символов.
Двоично-десятичное кодирование
Представление целых чисел в дополнительном коде
Другой способ представления целых чисел дополнительный код . Диапазон значений величин зависит от количества бит памяти, отведенных для их хранения. Например, величины типа Integer (все названия типов данных здесь и ниже представлены в том виде, в каком они приняты в языке программирования Turbo Pascal. В других языках такие типы данных тоже есть, но могут иметь другие названия) лежат в диапазоне от -32768 (-2 15 ) до 32767 (2 15 - 1) и для их хранения отводится 2 байта (16 бит); типа LongInt в диапазоне от -2 31 до 2 31 - 1 и размещаются в 4 байтах (32 бита); типа Word в диапазоне от 0 до 65535 (2 16 - 1) (используется 2 байта) и т.д.
Как видно из примеров, данные могут быть интерпретированы как числа со знаком , так и без знака . В случае представления величины со знаком самый левый (старший) разряд указывает на положительное число, если содержит нуль, и на отрицательное, если единицу.
Вообще, разряды нумеруются справа налево, начиная с 0. Ниже показана нумерация бит в двухбайтовом машинном слове.
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Дополнительный код положительного числа совпадает с его прямым кодом . Прямой код целого числа может быть получен следующим образом: число переводится в двоичную систему счисления, а затем его двоичную запись слева дополняют таким количеством незначащих нулей, сколько требует тип данных, к которому принадлежит число.
Например, если число 37 (10) = 100101 (2) объявлено величиной типа Integer ( шестнадцатибитовое со знаком ), то его прямым кодом будет 0000000000100101, а если величиной типа LongInt ( тридцатидвухбитовое со знаком ), то его прямой код будет 00000000000000000000000000100101. Для более компактной записи чаще используют шестнадцатеричное представление кода. Полученные коды можно переписать соответственно как 0025 (16) и 00000025 (16) .
Дополнительный код целого отрицательного числа может быть получен по следующему алгоритму:
- записать прямой код модуля числа;
- инвертировать его (заменить единицы нулями, нули единицами);
- прибавить к инверсному коду единицу.
Например, запишем дополнительный код числа -37, интерпретируя его как величину типа LongInt (тридцатидвухбитовое со знаком):
- прямой код числа 37 есть 00000000000000000000000000100101;
- инверсный код 11111111111111111111111111011010;
- дополнительный код 11111111111111111111111111011011 или FFFFFFDB(16).
При получении числа по его дополнительному коду прежде всего необходимо определить его знак. Если число окажется положительным, то просто перевести его код в десятичную систему счисления. В случае отрицательного числа необходимо выполнить следующий алгоритм:
- вычесть из кода числа 1;
- инвертировать код;
- перевести в десятичную систему счисления. Полученное число записать со знаком минус.
Примеры. Запишем числа, соответствующие дополнительным кодам:
- 0000000000010111. Поскольку в старшем разряде записан нуль, то результат будет положительным. Это код числа 23.
- 1111111111000000. Здесь записан код отрицательного числа. Исполняем алгоритм: 1) 1111111111000000(2) - 1(2) = 1111111110111111(2); 2) 0000000001000000; 3) 1000000(2) = 64(10).
Ответ: -64.
Кодирование вещественных чисел
Несколько иной способ применяется для представления в памяти персонального компьютера действительных чисел. Рассмотрим представление величин с плавающей точкой.
Любое действительное число можно записать в стандартном виде M × 10 p , где 1 £ M p целое. Например, 120100000 = 1,201 × 10 8 . Поскольку каждая позиция десятичного числа отличается от соседней на степень числа 10, умножение на 10 эквивалентно сдвигу десятичной запятой на одну позицию вправо. Аналогично деление на 10 сдвигает десятичную запятую на позицию влево. Поэтому приведенный выше пример можно продолжить: 120100000 = 1,201 × 10 8 = 0,1201 × 10 9 = 12,01 × 10 7 . Десятичная запятая "плавает" в числе и больше не помечает абсолютное место между целой и дробной частями.
В приведенной выше записи M называют мантиссой числа, а p его порядком. Для того чтобы сохранить максимальную точность, вычислительные машины почти всегда хранят мантиссу в нормализованном виде, что означает, что мантисса в данном случае есть число, лежащее между 1(10) и 2(10) (1 £ M
Тип | Диапазон | Мантисса | Байты |
---|---|---|---|
Real | 2,9×10 -39 ..1,7×10 38 | 11-12 | 6 |
Single | 1,5×10 -45 ..3,4×10 38 | 7-8 | 4 |
Double | 5,0×10 -324 ..1,7×10 308 | 15-16 | 8 |
Extended | 3,4×10 -4932 ..1,1×10 4932 | 19-20 | 10 |
Покажем преобразование действительного числа для представления его в памяти ЭВМ на примере величины типа Double.
Как видно из таблицы, величина это типа занимает в памяти 8 байт. На рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):
S | Смещенный порядок | Мантисса |
63 | 62..52 | 51..0 |
Можно заметить, что старший бит, отведенный под мантиссу, имеет номер 51, т.е. мантисса занимает младшие 52 бита. Черта указывает здесь на положение двоичной запятой. Перед запятой должен стоять бит целой части мантиссы, но поскольку она всегда равна 1, здесь данный бит не требуется и соответствующий разряд отсутствует в памяти (но он подразумевается). Значение порядка хранится здесь не как целое число, представленное в дополнительном коде. Для упрощения вычислений и сравнения действительных чисел значение порядка в ЭВМ хранится в виде смещенного числа, т.е. к настоящему значению порядка перед записью его в память прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. Например, для типа Double порядок занимает 11 бит и имеет диапазон от 2 -1023 до 2 1023 , поэтому смещение равно 1023(10) = 1111111111(2). Наконец, бит с номером 63 указывает на знак числа.
Таким образом, из вышесказанного вытекает следующий алгоритм для получения представления действительного числа в памяти ЭВМ:
- перевести модуль данного числа в двоичную систему счисления;
- нормализовать двоичное число, т.е. записать в виде M × 2 p , где M мантисса (ее целая часть равна 1(2)) и p порядок, записанный в десятичной системе счисления;
- прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;
- учитывая знак заданного числа (0 положительное; 1 отрицательное), выписать его представление в памяти ЭВМ.
Пример. Запишем код числа -312,3125.
- Двоичная запись модуля этого числа имеет вид 100111000,0101.
- Имеем 100111000,0101 = 1,001110000101 × 2 8 .
- Получаем смещенный порядок 8 + 1023 = 1031. Далее имеем 1031(10) = 10000000111(2).
- Окончательно
1 10000000111 0011100001010000000000000000000000000000000000000000 63 62..52 51..0
Очевидно, что более компактно полученный код стоит записать следующим образом: C073850000000000(16).
Другой пример иллюстрирует обратный переход от кода действительного числа к самому числу.
Данные и программы во время работы ПЭВМ размещаются в оперативной памяти (ОЗУ), которая представляет собой последовательность пронумерованных ячеек. По указанному номеру процессор находит нужную ячейку, поэтому номер ячейки называется ее адресом.
Минимальная адресуемая ячейка (согласно стандарту IBM), с точки зрения программиста, состоит из 8 двоичных позиций (т.е. в каждую двоичную позицию могут быть записаны либо 0, либо 1). Объем информации, который помещается в одну двоичную позицию, называется битом. Объем информации, равный 8 битам, называется байтом.
Таким образом, в одной ячейке из 8 двоичных разрядов помещается объем информации в один байт. Поэтому объем памяти принято оценивать количеством байт (2 10 байт = 1024 байт = 1 Кб, 2 10 Кб = 1048576 байт = 1 Мб).
Для помещения данных в такие ячейки производится их запись с помощью нулей и единиц (кодирование). При этом любые байты ОЗУ могут быть использованы для хранения информации любого рода; реальный смысл хранимых в них нулей и единиц определяется только при их использовании согласно замыслу программиста.
11.2. Кодирование целых чисел.
При кодировании целых чисел они преобразуются в двоичное представление. Например,
2 = 1×2 1 + 0×2 0 = 102; 5 = 1×2 2 + 0×2 1 + 1×2 0 = 1012; 256 = 1×2 8 = 1000000002.
С увеличением числа количество разрядов для его представления в двоичной системе резко возрастает, поэтому для размещения большого числа выделяется несколько подряд расположенных однобайтных ячеек. В этом случае адресом такой расширенной ячейки является адрес первого байта. Один бит такой ячейки может выделяться под знак числа. Числа, размещенные таким образом - целые.
Тип int - целое число, обычно соответствующее естественному размеру целых в используемой ЭВМ. Квалификаторы short и long, которые можно использовать с типом int, указывают на различные размеры целых, т.е. определяют размер памяти, выделяемой под переменную.
Примеры: short int x;
unsigned int x = 8; (декларация с одновременной инициализацией числом 8).
Слово int в таких ситуациях может быть опущено.
Тип char также может использоваться для хранения целых чисел; его размер составляет 1 байт.
С типами int и char могут использоваться атрибуты signed или unsigned. Они показывают, как интерпретируется старший бит числа - как знак, или как часть числа:
char | Знак | Значение числа |
6 5 4 3 2 1 0 | - номера битов |
unsigned char | Значение числа |
7 0 |
short | Знак | Значение числа |
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | - номера битов |
unsigned short | Значение числа |
15 0 |
long | Знак | Значение числа |
30 0 |
unsigned long | Значение числа |
31 0 |
По умолчанию все виды int и char считаются знаковыми (signed).
Отрицательные целые числа хранятся в т.н. дополнительном коде, в котором отрицательное двоичное число -X (здесь X - модуль этого числа) заменяется на 2 N -X, где N - число бит в ячейке. Легко заметить, что если само X не превосходит 2 N -1 , то полученное "дополнительное к нему" число окажется положительным, а старший бит ячейки - единицей. В то же время, "настоящие" положительные числа допустимого диапазона занимают не более N -1 бит, поэтому старший бит ячейки оказывается нулевым. Таким образом, старший бит signed - ячейки показывает знак исходного числа.
Такой способ хранения удобен для осуществления операции сложения. Действительно, хранимые числа либо совпадают с исходными (если исходные положительны), либо отличаются от них на 2 N (если исходные отрицательны). Поэтому и результат сложения может отличаться от правильного только на некоторое количество 2 N . Но 2 N соответствует N+1 - му двоичному разряду, который не помещается в ячейке и обычно просто отбрасывается.
short int a=1000; char b=-20;
В памяти они представляются следующим образом:
a | 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 |
b | 1 1 1 0 1 1 0 0 |
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | - номера битов |
Заметим еще, что байты числа хранятся в порядке "от младших разрядов - к старшим" (видимо, опять-таки для удобства операции сложения столбиком). Например, у вышеприведенного числа a=1000 первый байт будет равен 111010002 , а второй - 000000112.
11.3. Кодирование вещественных чисел.
Вещественные числа также хранятся в двоичном представлении. При этом они преобразуются в т.н. нормализованную экспоненциальную форму:
где x.xxx называется мантиссой числа, а P - его порядком. Нормализованность означает, что величина P подбирается так, чтобы в мантиссе перед точкой осталась лишь одна значащая (ненулевая, если только само число не равно 0) цифра.
Однако для двоичного числа ненулевая цифра может быть только 1, поэтому для ненулевых чисел нормализованная форма имеет вид:
а для нулевого числа величина P не играет роли.
Нормализованное число хранится в ячейке, занимающей несколько байт. Часть бит отводится на мантиссу, а часть на порядок, которые хранятся аналогично целым числам (знак порядка учитывается при этом несколько по-другому, чем знак целых чисел - к значению порядка (со знаком + или -) прибавляется (2 N -1 - 1), где N - число бит для хранения порядка. Например, в типе double порядок +2 хранится как 100000000012, а -2 -как 011111111012).
Типы вещественных чисел, поддерживаемые С++ Builder'ом:
Тип | Точность мантиссы (десятичныхцифр после запятой) | Порядок (деся-тичный) | Байт, всего | Из них бит на: |
знак числа | порядок (с его знаком) | мантиссу | ||
float | 7 - 8 | ± 38 | 23* | |
double | 15 - 16 | ± 308 | 52* | |
long double | 19 - 20 | ± 4932 |
* В типах float и double для экономии места первый (всегда единичный) бит мантиссы не хранится.
Как можно видеть из приведенных выше таблиц, при одинаковом количестве байт, отводимом, например, под величины типа float и long int, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления значений таких данных.
Программисту почти никогда не приходится непосредственно иметь дело с внутренним представлением вещественных чисел (в отличие от других типов). Однако он должен понимать ограничения, связанные с конечным числом бит, выделяемых под мантиссу и порядок, и вызванной этим конечной точностью хранения таких чисел. Из-за этого возможно появление погрешности, вызванной отбрасыванием "не вмещающихся" младших двоичных разрядов.
Рекомендуется поэтому, как упоминалось выше, вместо проверки двух вещественных величин на равенство (==) или неравенство (!=) вычислять разницу между ними и сравнивать ее с заданным малым числом - допустимой погрешностью, например:
11.4. Кодирование символов.
Символьная переменная занимает в памяти 1 байт и представляется кодом из 8 бит. При этом каждому символу соответствует определенный код:
Примеры кодов символов:
Символ | Код (двоичный) | Код (десятичный беззнаковый) | Код (десятичный знаковый) |
Пробел | |||
! | |||
А (большое латинское) | |||
B (большое латинское) | |||
a (малое латинское) | |||
А (большое русское) В кодировке ANSI | -64 | ||
А (большое русское) В кодировке ASCII | -128 |
Подобный код, как показано выше, соответствует также целому числу от 0 до 255 в беззнаковом (unsigned) формате. Таким образом, каждому символу соответствует целое число, также называемое кодом символа. Совокупность кодов символов называется кодовой таблицей или кодировкой.
Для персональных компьютеров наиболее распространены кодовые таблицы ANSI (American National Standard Institute) и ASCII (American Standard Code for Information Interchange). Таблица ANSI применяется в Windows, а ASCII применялась в DOS. Однако в этих двух таблицах первые 128 кодов (от 0 до 127) совпадают; они различаются лишь последующими 128 кодами, используемыми для хранения национальных (русских) букв и символов "псевдографики".
Стандартная часть таблицы символов (ASCII)
Некоторые из вышеперечисленных символов имеют особый смысл. Так, например, символ с кодом 9 обозначает символ горизонтальной табуляции, символ с кодом 10 – символ перевода строки, символ с кодом 13 – символ возврата каретки.
Дополнительная часть таблицы символов
КС | С | КС | С | КС | С | КС | С | КС | С | КС | С | КС | С | КС | С |
А | Р | а | ░ | └ | ╨ | р | Ё | ||||||||
Б | С | б | ▒ | ┴ | ╤ | с | ё | ||||||||
В | Т | в | ▓ | ┬ | ╥ | т | Є | ||||||||
Г | У | г | │ | ├ | ╙ | у | є | ||||||||
Д | Ф | д | ┤ | ─ | ╘ | ф | Ї | ||||||||
Е | Х | е | ╡ | ┼ | ╒ | х | ї | ||||||||
Ж | Ц | ж | ╢ | ╞ | ╓ | ц | Ў | ||||||||
З | Ч | з | ╖ | ╟ | ╫ | ч | ў | ||||||||
И | Ш | и | ╕ | ╚ | ╪ | ш | ° | ||||||||
Й | Щ | й | ╣ | ╔ | ┘ | щ | ∙ | ||||||||
К | Ъ | к | ║ | ╩ | ┌ | ъ | · | ||||||||
Л | Ы | л | ╗ | ╦ | █ | ы | √ | ||||||||
М | Ь | м | ╝ | ╠ | ▄ | ь | № | ||||||||
Н | Э | н | ╜ | ═ | ▌ | э | ¤ | ||||||||
О | Ю | о | ╛ | ╬ | ▐ | ю | ■ | ||||||||
П | Я | п | ┐ | ╧ | ▀ | я |
В таблицах обозначение КС означает "код символа", а С – "символ".
Тип char рассматривается компилятором как "целочисленный", поэтому возможно использование signed char (по умолчанию) - коды символов от -128 до +127 и unsigned char - коды символов от 0 до 255. При этом коды символов первой половины кодовой таблицы для signed char и unsigned char совпадают. Коды символов второй половины кодовой таблицы для signed char являются отрицательными, а для unsigned char - положительными, от 128 до 255 (см. выше кодировку целых отрицательных чисел).
Таким образом, одни и те же значения типа char могут рассматриваться и как символы, и как числа (знаковые либо беззнаковые); при этом конкретный смысл значения определяется операцией, которая над ним совершается.
Заметим, что коды однотипных символов (цифр; больших латинских букв; малых латинских букв) идут подряд, в порядке возрастания. Этим можно воспользоваться для упрощения многих действий.
Пример 1. Проверить, является ли символ цифрой. Если да, то присвоить переменной целого типа значение этой цифры.
i=c-'0'; // Равносильно i=c-48;
Пример 2. Занести в переменную случайно выбранную большую букву латинского алфавита.
randomize(); // Инициализация счетчика случайных чисел
c=random(26)+'A'; // 26 - число латинских букв в алфавите
Напомним, что символьная константа – это символ, заключенный в одинарные кавычки: 'A', 'х'.
Память состоит из отдельных ячеек, в каждой из которых можно хранить любую информацию или команды. Каждой ячейке присваивается определенный номер, который называется адресом.
Таким образом, ячейка памяти имеет две характеристики:
1) содержимое – информация, которая хранится
2) адрес – числовое значение, указывающее на положение ячейки в памяти.
Числовые данные хранятся в памяти с фиксированной или с плавающей запятой. Форма с фиксированной запятой используется для хранения целых чисел. Такое число занимает одну ячейку, один разряд которой отводится под знак числа, а остальные – для значения числа. Если ячейка имеет длину 4 байта (32 бита), то число может меняться в пределах от 0 до ±2 31 .
Форма с плавающей запятой используется для хранения дробных чисел. В двоичной системе счисления любое число с плавающей запятой записывается в виде N=±m *2 n , где m – мантисса (±m<1), n – целое число (порядок). Часть разрядов ячейки отводится для записи мантиссы с учетом знака, а другая часть – для записи порядка с учетом их знака.
Текстовые данные представляют собой последовательность 8 или 16 нулей и единиц.
Логические данные могут иметь лишь 2 значения – «истина» и «ложь». Они могут быть представлены в памяти различными способами, принятыми в конкретных вычислительных системах. В простейшем случае значение «истины» кодируется числом т1, «ложь» - числом 0, которые занимают одну ячейку памяти. Другим возможным вариантом является представление логических значений словами TRUE, FALSE.
Команды тоже хранятся в памяти наряду с данными. Каждая команда должна содержать следующую информацию:
1) вид выполняемой операции (сложение, умножение и т.д.)
2) данные, участвующие в операции.
Команда – последовательность двоичных чисел, содержит 2 части – операционную и адресную. По содержимому ячеек памяти не отличить данные от команд. Поэтому производят перераспределение памяти, т.е. указать адреса ячеек, где хранятся команды, где - данные.
Кодирование цветовой информации. С помощью одного байта можно закодировать 256 разных значений. Значит одним байтом можно закодировать 256 различных цветов. В принципе, этого достаточно для рисованных изображений типа тех, что мы видим в мультфильмах, но для полноцветных изображений живой природы – недостаточно. Человеческий глаз не самый совершенный инструмент, но и он может различать десятки миллионов цветовых оттенков. А если двумя байтами закодировать, то 2 16 =65536 различных цветов. Это уже лучше и похоже, что мы видим на фотографиях и на картинках в журналах, но все равно хуже, чем в живой природе. Если кодировать 3 байтами, то количество возможных цветов увеличится и достигнет 16,5 миллионов (2 24 =16,5 миллионов).
Этот режим позволяет хранить, обрабатывать и передавать изображения, не уступающие по качеству наблюдаемым в природе.
Возможно, вы знаете, что любой цвет можно представить в виде комбинации трех основных цветов: красного, зеленого и синего (их называют цветовыми составляющими). Если мы кодируем цвет точки с помощью трех байтов, то первый байт выделяется красной, второй – зеленой, третий – синей. Чем больше значение байта цветовой составляющей, тем ярче этот цвет.
Белый цвет. Если точка имеет белый цвет, значит у нее есть все цветовые составляющие, и они имеют полную яркость. Поэтому белый цвет кодируется тремя полными байтами: 255, 255, 255.
Черный цвет – 0,0,0 (т.е. отсутствие всех цветов).
Серый цвет Этот цвет, промежуточный между черным и белым. В нем есть все цветовые составляющие, но они одинаковы и нейтрализуют друг друга. Пример, 100,100,100 или 150,150,150. Во втором случае яркость выше, т.е. светлее первого.
Представление графической информации. Существуют два подхода к решению проблемы представления изображения на компьютере: растровый и векторный. Суть обоих подходов в декомпозиции, т.е. разбиении изображения на части, которые легко описать.
Растровый подход предполагает разбиение изображения на маленькие одноцветные элементы - видеопиксели, которые, сливаясь, дают общую картину. В таком случае видеоинформация представляет собой перечисление в определенном порядке цветов этих элементов.
Векторный подход разбивает всякое изображение на геометрические элементы: отрезки прямой, эллиптические дуги, фрагменты прямоугольников, окружностей, области однородной закраски. При таком подходе видеоинформация — это математическое описание перечисленных элементов в системе координат, связанной с экраном дисплея. Векторное представление более всего подходит для чертежей, схем, штриховых рисунков. Нетрудно понять, что растровый подход универсальный, т.е. он применим всегда, независимо от характера изображения. В силу дискретной (пиксельной) структуры экрана монитора, в видеопамяти любое, изображение представляется в растровом виде. На современных ПК используются только растровые дисплеи, работающие по принципу построчной развертки изображения.
Информация в видеопамяти (видеоинформация) представляет собой совокупность кодов цвета каждого пикселя экрана. Отсюда следует, что вопрос о представлении изображения связан со способами кодирования цветов. Физический принцип получения разнообразных цветов на экране дисплея заключается в смешивании трех основных цветов (метод RGB): красного, зеленого и синего. Значит информация, заключенная в коде пикселя должна содержать сведения о том, какую интенсивность (яркость) имеет каждая составляющая в его цвете.
Читайте также: