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

Тема 1. 2. Концепция типа данных

Понятие переменной

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

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

Описание переменных в программе имеет следующий формат:

[класс памяти][const]тип имя1 [иницал._выражение1], имя2 [иницал._выражение2],…;

Рассмотрим каждый элемент этого описания.

Имя – идентификатор;

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

Тип данных определяет:

- внутреннее представление данных в памяти компьютера;

- операции и функции, которые можно применять к объектам этого типа;

- множество значений, которое могут принимать величины этого типа.

Все типы языка С++ делят на основные и производные (составные).

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

В языках программирования к основным типам данных относят типы данных для хранения чисел (целочисленный тип, вещественный тип) и символов.

В языке С++ определено семь основных типов данных: шесть - для представления целых, вещественных, символьных и логических величин и один специальный тип void. Для описания шести основных определены следующие ключевые слова:

int –целый,

char, wchar_t – символьные,

float, double – вещественные,

bool – логический.

Кроме того, существуют четыре спецификатора, уточняющих внутренне представление и диапазон значений стандартных типов:

short -короткий,

long -длинный,

signed -знаковый (старший бит интерпретируется как знаковый, 0 – положительное, 1-отрицательное),

unsigned -беззнаковый.

Целые, символьные и вещественные типы называют также арифметическими типами.

Примеры описания переменных:

int a,b;//две переменные целого типа

float summa;// переменная вещественного типа

Рассмотрим основные типы подробнее.

Под переменную целого типа (int) отводится 2 или 4 байта (для 16-разрядного и 32-разрядного процессор соответственно). short int – 2 байта, long int – 4 байта. Константам приписывается тип в соответствии с их видом. По умолчанию целые константы интерпретируются как short и signed. Для изменения этой трактовки можно использовать суффиксы – L,l,U,u. Например, 8L, 71u.

Символьный тип (char)– 1 байт. (Для wchar_t – зависит от реализации, обычно 2 байта).

Рассмотрим внутреннее представление диапазон значений на примере типа char.

Самое маленькое беззнаковое число длиной в один байт 000000002=0

Самое большое беззнаковое число длиной в один байт 111111112=255.

Следовательно, тип беззнаковый тип char позволяет хранить 256 различных символа с кодами от 0 до 255.

Самое маленькое положительное число длиной в один байт 000000002=0

Самое большое положительное число длиной в один байт 011111112=127

Самое большое отрицательное число длиной в один байт 111111112=-1

Самое маленькое отрицательное число длиной в один байт 100000002=-128

Напомним, что для получения абсолютного значения отрицательного числа его инвертируют, то есть заменяют 0 на 1, 1 на 0 и добавляют единицу. Например, отрицательное число 10000000. Инвертируем – 01111111. Прибавляем 1

+ 1

100000002=128

Следовательно, тип знаковый тип char позволяет хранить 256 различных символа с кодами от -128 до 127.

Логический тип (bool) - 1 байт. Значение величин этого типа либо истина (true или 1), либо ложь (false или 0). Любое нулевое значение интерпретируется как ложь, любое ненулевое -как истина.

Вещественный тип (float, double, long double). Внутренне представление вещественных величин состоит из двух вещей – мантиссы и порядка. Например 148,35 можно представать как 1,4835*102, где 1,4835 – мантисса, 2- порядок. Мантисса >1 и < 2. Длинна мантиссы определяет точность числа, а длина порядка его диапазон. Для float отводится 4 байта = 1 знак + 8 порядок + 23 мантисса). Так как старшая цифра мантиссы =1, то она не хранится. Для double отводится 8 байт = 1 знак+11 порядок+52 мантисса. Константы вещественного типа по умолчанию имеют тип double. Для его изменения можно использовать суффиксы F,f,L,l.

Тип void – это специальный тип, множество значений этого типа пусто. Он не используется при описании переменных.

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

typedef unsigned char UC;

UC symbol; // symbol это переменная типа UC, то есть беззнаковая символьная

Продолжим рассматривать синтаксис описания переменных:

[класс памяти][const]тип имя1 [иницал._выражение1], имя2 [иницал._выражение2],…;

Для того чтобы понять, что такое класс памяти введем несколько определений.

Каждый программный объект в частности переменная характеризуется такими параметрами как

- область действия;

- область видимости;

- время жизни (продолжительность существования).

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

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

#include <iostrem.h>

int a=0;

main ()

{ cout<<a<< “\n”;

int a=10;

cout <<a<< “\n”;

cout <<::a;

}

Имя переменной должно быть уникальным в своей области видимости.

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

Класс памяти определяет размещение объектов в памяти, продолжительность существования и область действия переменной. Для его задания используются следующие спецификаторы:

auto – автоматическая переменная (память выделяется в стеке, время жизни - с момента описания и до конца блока, для локальных данный спецификатор действует - по умолчанию, для глобальных – не используется);

extern - внешняя переменная означает, что переменная определяется в другом месте программы (другом файле или ниже), доступны во всех модулях программы, где они описаны;

static – статическая переменная. Время жизни постоянное. Могут быть и локальными и глобальными. При этом глобальная статическая переменная может использоваться только в пределах того модуля, где она определена.

register – аналогично auto, но память выделяется по возможности в регистрах процессора (иначе обрабатывается как auto).

Если класс не указан явно, то определяется компилятором исходя из контекста описания переменной.

Инициал._выражение – необязательный инициализатор, определяющий начальное значение соответствующего объекта.

Синтаксис инициализатора переменной:

= инициал._выражение

либо

(инициал._выражение).

Например,

int a=10, c(11);

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

Например,

char sim=0x61; cout<<sim; // на экране появится символ a

bool f=10; cout<<f;// на экране появится 1

Кроме того, можно преобразовать типы явным образом:

(имя типа, к которому преобразуем) имя переменной

или

имя типа, к которому преобразуем (имя переменной).

Например,

char ch=’a’;

cout << (int) ch; или cout << int (ch);// на экране появится ASCII-кода символа a

Использовать допустимые неявные преобразования типов необходимо с большой осторожностью.

Необязательный модификатор const показывает, что значение переменной изменять нельзя. Если в описании указан модификатор const, то наличие инициализирующего выражения обязательно. То есть, недопустима запись const int a;

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

- содержит спецификатор extern;

- описывает имя типа, вводимого пользователем;

- описывает прототип функции;

- описывает имя класса;

- описывает статический компонент класса.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: