2.2. Стандартные типы данных, модификаторы,
квалификаторы доступа и преобразование типов данных
Каждая программа обрабатывает определенную информацию. В C++ данные имеют один из восьми базовых типов: char (текстовые данные), int (целые числа), float (числа с плавающей запятой одинарной точности), double (числа с плавающей запятой двойной точности), void (пустые значения), bool (логические значения), перечисления и указатели.
Текст (тип данных char) представляет собой последовательность символов, которые могут быть разделены пробелами. Обычно каждый символ занимает 8 бит, или один байт, с диапазоном значений от 0 до 255.
Целые числа (тип данных int) находятся в диапазоне от -32768 до 32767 и занимают 16 бит, то есть два байта, или одно слово. В Windows 98 и Windows NT и более современных ОС Windows используются 32-разрядные целые числа, что позволяет расширить диапазон значений от -2147483648 до 2147483647.
В C++ поддерживаются три типа целых чисел. Наряду со стандартным типом int существуют типы short int (короткое целое) и long int (длинное целое). Допускается сокращенная запись short и long.
Числа с плавающей запятой одинарной точности (тип данных float) могут быть представлены как в фиксированном формате, так и в экспоненциальном. Диапазон значений — ±3.4Е-38 до ±3.4Е+38, размерность — 32 бита, то есть 4 байта, или 2 слова.
Числа с плавающей запятой двойной точности (тип данных double) имеют диапазон значений от ±1.7Е-308 до ±1.7Е+308 и размерность 64 бита, то есть 8 байтов, или 4 слова. Ранее существовал тип long double с размерностью 80 бит и диапазоном от ±1.18Е-4932 до ±1.18Е+4932. В новых 32-разрядных версиях компиляторов он эквивалентен типу double и поддерживается из соображений обратной совместимости с написанными ранее приложениями.
Перечисления представляются конечным набором именованных констант различных типов.
Тип данных void, как правило, применяется в функциях, не возвращающих никакого значения. Этот тип данных также можно использовать для создания обобщенных указателей.
Указатели, в отличие от переменных других типов, содержат не данные в обычном понимании этого слова, а адреса памяти, где хранятся данные.
Переменные нового логического типа данных bool в C++ могут содержать только одну из двух констант: true или false.
Компилятор языка C++ позволяет при описании переменных указывать модификатор unsigned. Он применяется с четырьмя типами данных: char, short, int и long. Наличие данного модификатора указывает на то, что значение переменной должно интерпретироваться как беззнаковое число, то есть самый старший бит является битом данных, а не битом знака. Существует модификатор signed, который выполняет противоположное unsigned действие.
В C++ используются два квалификатора доступа const и volatile. Они применяются для обозначения неизменяемых переменных (const) и переменных, значения которых могут измениться в любой момент (volatile).
Иногда требуется, чтобы значение переменной оставалось постоянным в течение всего времени работы программы. Такие переменные называются константными. Например, если в программе вычисляется длина окружности или площадь круга, часто придется оперировать числом (3,14159). В бухгалтерских программах такой величиной является НДС.
Применение квалификатора volatile может понадобиться в том случае, когда переменная обновляется системными устройствами, например таймером. При получении сигнала от таймера выполнение программы прерывается, и значение переменной изменяется.
Квалификатор volatile также применяется при описании объектов данных, совместно используемых разными процессами в многозадачной среде.
Допускается в некоторых случаях одновременное применение квалификаторов const и volatile.
В С++ применяются и другие квалификаторы. Их рассмотрение выходит за рамки руководства.
Часто бывает, когда в операции участвуют переменные разных типов. Такие операции называются смешанными. Например:
int ival;
float fres;
ival=ival*fres;
В процессе выполнения смешанных операций компилятор автоматически производит преобразования типов данных. Целочисленное значение переменной ival считывается из памяти, приводится к типу с плавающей запятой и умножается на исходное значение переменной fres. Результат в виде значения с плавающей запятой присваивается переменной целого типа ival. Автоматические преобразования типов данных при выполнении смешанных операций осуществляются в соответствии с иерархией преобразований. Суть состоит в том, что с целью повышения производительности в смешанных операциях значения разных типов временно приводятся к тому типу данных, который имеет больший приоритет в иерархии. Ниже перечислены типы данных в порядке снижения приоритета: double, float, long, int, short.
Если значение преобразуется к типу, имеющему большую размерность, нет потери информации, вследствие чего не страдает точность вычислений.
Иногда требуется изменить тип переменной, не дожидаясь автоматического преобразования. Для этого предназначена операция приведения типа. Если в программе необходимо временно изменить тип переменной, нужно перед ее именем ввести в круглых скобках название соответствующего типа данных. Например:
fr=fv+(float)iv/iw;
fr=fv+iv/(float)iw;
fr=fv+(float)iv/(float)iw;
Во всех трех случаях перед выполнением деления происходит явное приведение значения одной или обеих переменных к типу float.