Основные типы данных и их внутреннее представление 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Основные типы данных и их внутреннее представление



 

Переменные и константы

 

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

Понятие «тип» - одно из фундаментальных для любого языка программирования. В С++ все типы разбиваются на 4 категории: «пустой» тип (void); скалярный тип; тип «функция»; агрегированный тип (агрегат).

К скалярным относят арифметические типы, перечисления, указатели, ссылочный тип (reference type). К агрегированным типам относят массивы, структуры и объединения и классы.

Кроме того, типы могут быть разделены на основные (фундаментальные) и производные (derived). К основным типам относят void, char, int, float, и double вместе с вариантами short, long, signed и unsigned, применимыми к некоторым из них.

В С++ есть набор основных типов, которые соответствуют наиболее общим основным единицам памяти компьютера и наиболее общим основным способам их использования:

char, short int, int, long int для представления целых различных размеров;

float, double для представления чисел с плавающей точкой;

unsigned char, unsigned short int, unsigned int, unsigned long int для представления беззнаковых целых, логических значений, битовых массивов и т.п.

Производные типы - это указатели и ссылки на другие типы, массивы, функции, классы, структуры и объединения.

 

Данные типа int

 

Тип «целое» (integer) включает данные типа char, short, int И long вместе с их вариантами signed и unsigned. Данные типа int (переменные и константы) могут быть в одной из следующих возможных форм, указанных в табл.1.

 

Таблица 1

Данные типа int для компилятора Borland C++ 3.1

 

Тип Размер, Бит Диапазон представления чисел
    Минимум Максимум
Unsigned int Short int Int Long Unsigned long   -32 768 -32 768 -2 147 483 648 65 535 32 767 32 767 2 147 483 647 4 294 967 295  

 

Как следует из таблицы, short int и int являются синонимами. Синонимами являются типы unsigned int и unsigned.

Язык С++ поддерживает IEEE – стандарт внутреннего представления данных типа int (рис.1).

 

Int S Значение числа
    14 0

 

unsigned int Значение числа
  15 0

 

long int S Значение числа
    30 0

 

long unsigned Значение числа
  31 0

 

S - знаковый разряд числа

 

Рис.1. IEEE - стандарт внутреннего представления данных типа int

 

В компьютере с 16-ти разрядным процессором данные типа int занимают 2-а байта памяти (машинное слово), данные типа long занимают 4-ре байта. Старший бит знаковых типов int, short int, long int хранит знак числа. Если он равен нулю, число положительное, если он равен единице – число отрицательное. Положительные числа хранятся в памяти и вступают в операции в прямом коде, т.е. в обычном двоичном представлении числа. Отрицательные числа хранятся в памяти компьютера в дополнительном коде. Приведем правило получения дополнительного кода:

модуль отрицательного числа записывается в прямом коде в битах 14-0 или 30-0 «прижатым» вправо. В неиспользуемые старшие биты записываются нули;

в знаковый разряд бит 15 или 31 записывается 1;

формируется обратный код битов 14-0 или 30-0; для этого нуль заменяется единицей, а единица нулем;

к обратному коду числа прибавляется единица.

Например, обратный код числа –33 в формате int:

 

  14 0  
  000.0000.0010.0001 Прямой код
  111.1111.1101.1110 Обратный код
+    
  111.1111.1101.1111 Дополнительный код FFDEh

 

Константы типа int могут задаваться в десятичной, восьмеричной и шестнадцатеричной системой счисления. Признаком константы в шестнадцатеричной системе счисления являются 0х (0Х) в качестве первых ее символов. Запись такой константы может содержать цифры от 0 до 9, а также символы шестнадцатеричных цифр A-F. Любая константа, начинающаяся с нуля, рассматривается компилятором как заданная в восьмеричной системе счисления.

Если в записи константы встречается суффикс L (l), компилятор интерпретирует константу как long. Суффикс U(u) явно указывает на константу типа unsigned. Разрешается комбинировать оба суффикса в любом порядке, например 976LU.

При отсутствии суффиксов L(l) или U(u) точный тип константы определяется по ее записи (табл.2). Отрицательные константы получаются применением операции «унарный минус» к соответствующей положительной константе.

Переменная типа int объявляется с использованием ключевых слов unsigned, int, short, long. Синонимами будут сочетания ключевых слов: signed int и int; unsigned int и unsigned; short, sort int и signed short int; unsigned short и unsigned short int; long, long int и signed long int; unsigned long и unsigned long int.

При описании переменной ей может быть задано начальное значение. Например:

int i=0xabcd, j=04567, k=1;

Таблица 2

Целые константы и их тип при отсутствии суффиксов для компилятора

Borland C++ 3.1

 

Записанное значение константы Тип, принимаемый компилятором
Десятичные константы: От 0 до 32 767 От 32 768 до 2 147 483 647 От 2 147 483 648 до 4 294 967 295 > 4 294 967 295     Int Long Unsigned long Генерируется ошибка
Восьмеричные константы: От 00 до 077777 От 0100000 до 0177777 От 02000000 до 017777777777 От 020000000000 до 037777777777 > 037777777777   Int Unsigned int Long Unsigned long Генерируется ошибка
Шестнадцатиричные константы: От 0x0000 до 0x7FFF От 0x8000 до 0xFFFF От 0x10000 до 0x7FFFFFFF От 0x80000000 до 0xFFFFFFFF > 0xFFFFFFFF   Int Unsigned int Long Unsigned long Генерируется ошибка

 

Если в описании опущен тип, он предполагается int. Например:

const a = 1;

static x;

все определяют объект типа int.

 

Данные типа char

 

Данные типа char занимают в памяти 1 байт. Код от 0 до 255 в этом байте задает один из 256 возможных символов. Закрепление конкретных символов за кодами задается так называемыми кодовыми таблицами. Для персональных компьютеров наиболее распространена ASCII-таблица.

Тип char является типом «целое». Данные типа char могут рассматриваться компилятором и как данные со знаком (signed char), и как данные без знака (unsigned char).

Если тип char рассматривается как signed, то старший бит его кода определяет знак. В случае unsigned char все восемь бит рассматриваются как код, а диапазон возможных значений от 0 до 255.

Константа типа char представляет собой символ заключенный в одиночные кавычки, например ‘A’, ‘$’. Внутренний код байта, соответствующего константе, определяется по кодовой таблице.

Представление группы символьных констант описаны ниже в параграфе 2.5.3.

Переменная типа char занимает 1 байт памяти и описывается с использованием ключевого слова char. При описании переменной ей можно задать начальное значение. Например:

char symbol=’\0100’; /* прописная латинская P */

char name=’0’, first=’\n’;

 

Данные с плавающей точкой

 

Язык Borland C++ поддерживает операции с плавающей точкой. Особенностью персональных компьютеров IBM PC является отсутствие в системе команд микропроцессора Intel, на базе которых они построены, операций над числами с плавающей точкой. Такие арифметические операции выполняет либо специальный сопроцессор математики с плавающей точкой (сопроцессоры 8087/80287/80387), либо при его отсутствии специальные стандартные подпрограммы (программная эмуляция сопроцессора).

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

 

Таблица 3

Данные с плавающей точкой для компилятора Borland C++ 3.1

 

  Тип Размер, бит Диапазон представления чисел(abs) Точность (десятичных цифр)
    Максимум минимум  
Float Double Long double   3.4*10-38 1.7*10-308 3.4*10-4932 3.4*1038 1.7*10308 3.4*104932 19

Borland C++ поддерживает IEEE-стандарт, в соответствии с которым такие данные представляются в виде двух частей – мантиссы М и порядка Р числа в двоичной системе счисления:

С = М * 2Р

Число бит для хранения мантиссы и порядка зависит от типа данных с плавающей точкой (рис. 2).

 

 

float: S P M  
    30 23 22 0  
double: S P M  
    62 52 51 0  
long double: S P M
    78 64 63 0
               

 

 

S – знак числа (0 – для положительных, 1 – для отрицательных);

Р – сдвинутый порядок числа;

М – мантисса числа.

 

Рис. 2. IЕЕЕ-стандарт внутреннего представления данных с плавающей точкой.

 

Вещественное число в памяти хранится с нормализованной мантиссой. При нарушении нормализации мантиссу сдвигают влево до тех пор, пока старшей цифрой мантиссы не станет 1. Каждая операция сдвига сопровождается уменьшением порядка на 1. Но если мантисса всегда нормализована, то старшую едини­цу можно и не хранить в памяти. Это экономит один бит и, следовательно, увеличивает точность представления веществен­ных чисел. Эта единица присутствует неявно и называется неяв­ной единицей (implicit one). Отбрасывание старшей цифры мантиссы выполняется для форматов float и double, но не выполня­ется для long double.

Порядок числа хранится "сдвинутым", т. е. к нему при­бавляется число так, чтобы порядок был всегда неотрицатель­ным. Для чисел формата float прибавляется 127, для чисел формата double - 1023, для чисел формата long double -16383. Всегда неотрицательный порядок избавляет от необходимости выделять один бит для хранения знака порядка и упрощает выполнение операций сравнения порядков и арифметических операций над ними.

Например, число 15.375 (1111.011 в двоичной системе счисления) в формате float IEEE-стандарта записывается так:

1.111011*211.

Учитывая отбрасывание неявной единицы и сдвиг порядка, получаем внутреннее представление числа:

S = 0;

Р = 3+127 = 130(1000.0010 в двоичной системе счисления);

М = 1110110...0.

Переменные с плавающей точкой описываются с использованием спецификаторов типа float, double, long double.

Причина того, что представляется более чем один целый тип, более чем один беззнаковый тип и более чем один тип с плавающей точкой в том, чтобы дать возможность программисту воспользоваться характерными особенностями аппаратного обеспечения. На многих машинах между различными разновидностями основных типов существуют значительные различия в потребностях в памяти, временах доступа к памяти и временах вычислений. Размеры типов не указаны в стандарте языка а зависят от операционной системы, компилятора и разрядности процессора. В компьютерах с 16-ти разрядными процессорами int – 2 байта, в компьютерах с 32-х разрядными процессорами – 4 байта и т.д. В стандарте языка С++ указаны следующие соотношения относительно размеров основных типов:

I = = sizeof (char) < = sizeof(short) < = sizeof(int) < = sizeof(long)

sizeof (float) < = sizeof(double)

Однако обычно разумно предполагать, что в char могут храниться целые числа в диапазоне 0…127, что short и int имеют не менее 16 битов, что int имеет, по меньшей мере, 24 бита.

Беззнаковые (unsigned) целые типы идеально подходят для применений, в которых память рассматривается как массив битов.

 

Константы

 

С++ дает возможность записи значений основных типов: символьных констант, целых констант и констант с плавающей точкой. Кроме того, нуль (0) может использоваться как константа любого указательного типа, и символьные строки являются константами типа char[]. Можно также задавать символические константы. Символическая константа - это имя, значение которого не может быть изменено в области его видимости. В С++ имеется три механизма определения символических констант: 1) любому значению любого типа можно дать имя и использовать его как константу, добавив к его описанию ключевое слово const; 2) множество целых констант может быть определено как перечисление; 3) любое имя массива или функции является константой.

 

Целые константы

 

Целые константы предстают в четырех "обличиях": десятичные, восьмеричные, шестнадцатиричные и символьные константы. Десятичные используются чаще всего и выглядят так:

0 1234 5768595974474736

Десятичная константа имеет тип int, при условии, что она "влезает" в int, в противном случае ее тип – long суффикс L или l явно указывает компилятору, что тип константы – long, например 314564L или 3254354l. Компилятор должен предупреждать о константах, которые слишком длинны для представления в машине.

Константа, начинающаяся нулем, за которым идет x (0x), является шестнадцатеричным числом, а константа, начинающаяся нулем, за которым идет цифра, является восьмеричным числом. Например:

0 02 045 09786 07564 / / восьмеричные константы

0x0 0x6 0x3f 0x56 / / шестнадцатеричные константы

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 2110; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.137.108 (0.028 с.)