Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Общие понятия

Размещение данных и программ в памяти ПЭВМ

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

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

Таким образом, в одной ячейке из 8 двоичных разрядов помещается объем информации в один байт. Поэтому объем памяти принято оценивать количеством байт (210 байт = 1024 байт = 1 Кб, 210 Кб = 1048576 байт = 1 Мб).

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

 

11.2. Кодирование целых чисел.

При кодировании целых чисел они преобразуются в двоичное представление. Например,

2 = 1×21 + 0×20 = 102; 5 = 1×22 + 0×21 + 1×20 = 1012; 256 = 1×28 = 1000000002.

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

Тип int - целое число, обычно соответствующее естественному размеру целых в используемой ЭВМ. Квалификаторы short и long, которые можно использовать с типом int, указывают на различные размеры целых, т.е. определяют размер памяти, выделяемой под переменную.

Примеры: short int x;

long 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 - модуль этого числа) заменяется на 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 первый байт будет равен 11101000 2 , а второй - 00000011 2.

11.3. Кодирование вещественных чисел.

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

±x.xxx∙2±P

где x.xxx называется мантиссой числа, а P - его порядком. Нормализованность означает, что величина P подбирается так, чтобы в мантиссе перед точкой осталась лишь одна значащая (ненулевая, если только само число не равно 0) цифра.

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

±1.xxx∙2±P

а для нулевого числа величина 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, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления значений таких данных.

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

Рекомендуется поэтому, как упоминалось выше, вместо проверки двух вещественных величин на равенство (==) или неравенство (!=) вычислять разницу между ними и сравнивать ее с заданным малым числом - допустимой погрешностью, например:

 

if (fabs(y-z)<0.0000001)

 

Отметим, что при вычислениях с веществеными числами, в отличие от целых, машина следит, чтобы операнды и результат лежали в допустимых пределах. В противном случае, либо выдается сообщение об ошибке ("Floating point overflow"), либо результату присваивается "недопустимое" значение, соответствующее недопустимому сочетанию значений мантиссы и порядка ("NAN", "INF").

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)

КС С КС С КС С КС С КС С КС С КС С КС С
                @   P   `   p
      !       A   Q   a   q
      "       B   R   b   r
      #       C   S   c   s
      $       D   T   d   t
    §   %       E   U   e   u
      &       F   V   f   v
      '       G   W   g   w
      (       H   X   h   x
      )       I   Y   i   y
      *   :   J   Z   j   z
      +   ;   K   [   k   {
      ,   <   L   \   l   |
      -   =   M   ]   m   }
      .   >   N   ^   n   ~
      /   ?   O   _   o  

 

Некоторые из вышеперечисленных символов имеют особый смысл. Так, например, символ с кодом 9 обозначает символ горизонтальной табуляции, символ с кодом 10 – символ перевода строки, символ с кодом 13 – символ возврата каретки.

Дополнительная часть таблицы символов

КС С КС С КС С КС С КС С КС С КС С КС С
  А   Р   а         р   Ё
  Б   С   б         с   ё
  В   Т   в         т   Є
  Г   У   г         у   є
  Д   Ф   д         ф   Ї
  Е   Х   е         х   ї
  Ж   Ц   ж         ц   Ў
  З   Ч   з         ч   ў
  И   Ш   и         ш   °
  Й   Щ   й         щ  
  К   Ъ   к         ъ   ·
  Л   Ы   л         ы  
  М   Ь   м         ь  
  Н   Э   н         э   ¤
  О   Ю   о         ю  
  П   Я   п         я    

 

В таблицах обозначение КС означает "код символа", а С – "символ".

 

Тип char рассматри­вается компиля­то­ром как "целочисленный", поэтому возможно использование signed char (по умолчанию) - коды символов от -128 до +127 и unsigned char - коды символов от 0 до 255. При этом коды символов первой половины кодовой таблицы для signed char и unsigned char совпадают. Коды символов второй половины кодовой таблицы для signed char являются отрицательными, а для unsigned char - положительными, от 128 до 255 (см. выше кодировку целых отрицательных чисел).

Таким образом, одни и те же значения типа char могут рассматриваться и как символы, и как числа (знаковые либо беззнаковые); при этом конкретный смысл значения определяется операцией, которая над ним совершается.

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

 

Пример 1. Проверить, является ли символ цифрой. Если да, то присвоить переменной целого типа значение этой цифры.

 

char c; int i;

...

if (c>='0' && c<='9')

i=c-'0'; // Равносильно i=c-48;

 

Пример 2. Занести в переменную случайно выбранную большую букву латинского алфавита.

 

#include<stdlib.h>

...

char c;

randomize(); // Инициализация счетчика случайных чисел

...

c=random(26)+'A'; // 26 - число латинских букв в алфавите

 

Напомним, что символьная константа – это символ, заключенный в одинарные кавычки: 'A', 'х'.

 

<== предыдущая лекция | следующая лекция ==>
Компонента StringGrid | 
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 232; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.051 сек.