- •11. Размещение данных и программ в памяти пэвм
- •11.1. Общие понятия.
- •11.2. Кодирование целых чисел.
- •11.3. Кодирование вещественных чисел.
- •11.4. Кодирование символов.
- •Примеры кодов символов:
- •Стандартная часть таблицы символов (ascii)
- •Дополнительная часть таблицы символов (ascii)
- •11.5. Операция sizeof
- •11.6. Побитовые логические операции. Операции над битами
- •11.7. Кодирование программы.
- •11.8. Регистры
11. Размещение данных и программ в памяти пэвм
11.1. Общие понятия.
Данные и программы во время работы ПЭВМ размещаются в оперативной памяти (ОЗУ), которая представляет собой последовательность пронумерованных ячеек. По указанному номеру процессор находит нужную ячейку, поэтому номер ячейки называется ее адресом.
Минимальная адресуемая ячейка (согласно стандарту IBM), с точки зрения программиста, состоит из 8 двоичных позиций (т.е. в каждую двоичную позицию могут быть записаны либо 0, либо 1). Объем информации, который помещается в одну двоичную позицию, называется битом. Объем информации, равный 8 битам, называется байтом.
Таким образом, в одной ячейке из 8 двоичных разрядов помещается объем информации в один байт. Поэтому объем памяти принято оценивать количеством байт (210 байт = 1024 байт = 1 Кб, 210 Кб = 1048576 байт = 1 Мб).
Для помещения данных в такие ячейки производится их запись с помощью нулей и единиц (кодирование). При этом любые байты ОЗУ могут быть использованы для хранения информации любого рода; реальный смысл хранимых в них нулей и единиц определяется только при их использовании согласно замыслу программиста.
11.2. Кодирование целых чисел.
При кодировании целых чисел они преобразуются в двоичное представление. Например,
2 = 121 + 020 = 102; 5 = 122 + 021 + 120 = 1012; 256 = 128 = 1000000002.
С увеличением числа количество разрядов для его представления в двоичной системе резко возрастает, поэтому для размещения большого числа выделяется несколько подряд расположенных однобайтных ячеек. В этом случае адресом такой расширенной ячейки является адрес первого байта. Один бит такой ячейки может выделяться под знак числа. Числа, размещенные таким образом - целые.
Тип int - целое число, обычно соответствующее естественному размеру целых в используемой ЭВМ. Квалификаторы short и long, которые можно использовать с типом int, указывают на различные размеры целых, т.е. определяют размер памяти, выделяемой под переменную.
Примеры: short int x;
long int x;
unsigned int x = 8; (декларация с одновременной инициализацией числом 8).
Слово int в таких ситуациях может быть опущено.
Тип char также может использоваться для хранения целых чисел; его размер составляет 1 байт.
С типами int и char могут использоваться атрибуты signed или unsigned. Они показывают, как интерпретируется старший бит числа - как знак, или как часть числа:
-
char
Знак
Значение числа
7
6 5 4 3 2 1 0
- номера битов
-
unsigned char
Значение числа
7 6 5 4 3 2 1 0
-
short
Знак
Значение числа
15
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- номера битов
-
unsigned short
Значение числа
15 ……………………………… 0
-
long
Знак
Значение числа
31
30 ……………………………… 0
-
unsigned long
Значение числа
31 ……………………………… 0
По умолчанию все виды int и char считаются знаковыми (signed).
Отрицательные целые числа хранятся в т.н. дополнительном коде, в котором отрицательное двоичное число -X (здесь X - модуль этого числа) заменяется на 2N-X, где N - число бит в ячейке. Легко заметить, что если само X не превосходит 2N-1 , то полученное "дополнительное к нему" число окажется положительным, а старший бит ячейки - единицей. В то же время, "настоящие" положительные числа допустимого диапазона занимают не более N -1 бит, поэтому старший бит ячейки оказывается нулевым. Таким образом, старший бит signed - ячейки показывает знак исходного числа.
Такой способ хранения удобен для осуществления операции сложения. Действительно, хранимые числа либо совпадают с исходными (если исходные положительны), либо отличаются от них на 2N (если исходные отрицательны). Поэтому и результат сложения может отличаться от правильного только на некоторое количество 2N. Но 2N соответствует N+1 - му двоичному разряду, который не помещается в ячейке и обычно просто отбрасывается.
Пример:
short int a=1000; char b=-20;
В памяти они представляются следующим образом:
100010 = 11111010002 , (28-20)10 = 111011002 ,
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.