|
Издание: C++. Специальный справочник
Язык С++ поддерживает несколько базовых типов данных, которые также называют простыми (иногда арифметическими) типами данных. Эти типы определены в самом языке, и все остальные типы строятся на их основе. В табл. 1 приводятся все простейшие типы данных, определенные в С++.
Следующие замечания поясняют некоторые из особенностей использования типов в С++.
В спецификации ANSI область изменения целых чисел определена от -127 до 127. Однако использование дополнительного кода (см. также раздел "Дополнительный формат" в главе "Словарь терминов и понятий") увеличивает эту область на единицу, и минимальное целое число равно -128. Числа в плавающем формате не предоставляют возможности точного задания числа 0. Точность определения нуля зависит от выбранного формата числа. Например, число 1E-50 (единица, деленная на 10 в степени 50) не может быть задано типом float, но может быть определено типом double.
ВНИМАНИЕ Константы типа int и long имеют разное представление в памяти компьютера: первые занимают два байта, вторые - четыре байта. Будьте особенно внимательны при задании функций, имеющих параметры типа long, не забывайте указывать суффикс L при их записи. Язык С++ поддерживает два варианта записи констант с плавающей точкой (иногда говорят - с плавающей запятой): с десятичной точкой (.) в качестве разделителя и экспоненциальную форму, в которой используются символы e или E (для указания числа 10 в качестве основания степени), за которым следует показатель степени.
Тем не менее типы чисел с плавающей точкой являются более гибкими, и во многих случаях их использование необходимо. Следующий пример демонстрирует получение неправильного результата при неверном выборе типов переменных:
boolТип данных bool (булев) определяет ровно два значения true и false. Переменные этого типа в основном используются в двух случаях: при определении сложных условий в условных инструкциях и в качестве флагов в инструкциях цикла:
Обычно в С и С++ значения true и false присваивались переменным целого типа. Сейчас более предпочтительным вариантом является использование булевого типа данных для этих значений. Булевой переменной можно присвоить любое целое значение (компилятор выдаст предупреждение, если при этом не выполнено приведение типов), но любое ненулевое значение при этом автоматически преобразуется в true (1).
ПРИМЕЧАНИЕ В С и ранних версиях С++ булев тип не поддерживался. charВ памяти компьютера тип данных char представляется, как и другие целые типы, числом, однако в действительности это число является кодом символа. Преобразование символа в число и обратно происходит автоматически в соответствии с таблицей кодировки символов ASCII, представленной в приложении "Таблица ASCII-кодов". Например, код символа "равно" (=) представляется в памяти компьютера как число 61 и занимает один байт. При его обозначении в качестве простого символа он должен быть заключен в апострофы.
ВНИМАНИЕ При работе со строками переменной длины следует внимательно следить за их длиной, так как автоматического контроля за переполнением массива, отведенного для строки, не производится. Таким образом, копирование строки в слишком короткий массив, отведенный для нее, может привести к порче данных в памяти. ПРИМЕЧАНИЕ Некоторые кодировки символов, например Unicode, требуют для каждого символа два байта. Требованиям таких кодовых таблиц удовлетворяет тип wchar_t. Для управления выводом строки в ней могут быть использованы управляющие последовательности (управляющие символы), представленные в табл. 2. Наиболее часто используемым среди них является символ новой строки (\n). Обратный слэш (\) в С++ всегда является признаком управляющей последовательности, и в связи с этим обычный символ слэша ('\') должен записываться как "двойной слэш", заключенный в апострофы ('\\').
unsigned charТип unsigned char используется для беззнаковых значений, находящихся в пределах от 0 до 255, и занимает один байт. Подобно типу char тип unsigned char более характерен для определения массивов, чем отдельных переменных, в частности, может быть полезен для определения буферов, хранящих последовательности двоичных данных, например:
signed charТип signed char используется для значений, находящихся в пределах от -128 до 127, и занимает один байт. Тип char часто, но не всегда, эквивалентен типу signed char. Подобно типам char и unsigned char тип signed char может задаваться для определения буферов, хранящих последовательности двоичных данных, например:
Другое различие заключается в том, что если значение большее 128 и меньшее 255 присваивается типу signed char, то компилятор должен его преобразовать. Возможно, при этом будет выведено предупреждение. intТип int является наиболее используемым целым типом С и С++. Единственное, что можно сказать определенно, это то, что число типа int не короче числа типа short и не длиннее числа типа long:
Этот тип используется для объявления положительных или отрицательных целых чисел. В 16-разрядных системах числа типа int могут принимать значения от -32 768 до 32 767 и занимают 2 байта. В 32-разрядных системах числа этого типа занимают 4 байта и принимают те же значения, что и длинные целые, поэтому существует потенциальная опасность того, что в 32-разрядных системах не возникнет ошибки превышения возможного значения.
unsigned intТип unsigned int имеет тот же размер, что и тип int: 2 байта в 16-разрядных системах (возможные значения от 0 до 65 535) и 4 байта в 32-разрядных системах (возможные значения те же, что и у unsigned long):
Большая часть свойств, описанных для целых чисел со знаком, распространяется на беззнаковые целые - главное их отличие заключается в том, что числа типа unsigned int не могут принимать отрицательные значения. Для переносимости программ оптимальным решением является использование типов unsigned short и unsigned long.
Для определения константы в виде беззнакового целого можно определять ее в шестнадцатеричном виде или использовать суффикс U:
shortТип short определяет двухбайтные целые числа, которые могут принимать отрицательные значения. Область изменения от -32 768 до 32 767. Этот тип более предсказуем, чем тип int. По умолчанию компилятор сохраняет все целые константы в виде двухбайтных целых чисел со знаком до тех пор, пока этого объема памяти достаточно для их размещения. unsigned shortТип unsigned short является двухбайтным целым, которое не может принимать отрицательные значения. Область изменения от 0 до 65 535.
longТип long является четырехбайтным целым типом, переменные которого могут принимать отрицательные значения. Область его изменения от -2 147 483 648 до 2 147 483 647. Это самый "большой" стандартный целый тип ANSI C:
Первая инструкция этого примера не дает верного произведения, так как сначала выполняется умножение двух целых чисел, в результате получается целое число, которое затем присваивается переменной res1. Только в случае, если хотя бы один из операндов является длинным целым, в результате получается длинное целое. (Другим решением проблемы res1 является использование приведения типа переменной a к типу long:
unsigned longТип unsigned long является четырехбайтным целым типом, переменные которого не могут принимать отрицательные значения. Область его изменения от 0 до 4 294 967 295. Отсутствие возможности для хранения отрицательных чисел компенсируется в этом типе увеличением в два раза возможных значений положительных чисел:
floatТип float используется для четырехбайтных чисел с плавающей точкой. Область изменения чисел этого типа от -3.4*10+38 до -3.4*10-38 и от 3.4*10-38 до 3.4*10+38, при этом обеспечивается точность не меньше шести десятичных цифр.
Для сохранения констант в виде числа с плавающей точкой обычной точности следует использовать суффикс F, в противном случае константы сохраняются в виде чисел двойной точности (компилятор при этом может выдавать предупреждение о возможной потере данных в связи с присваиванием константы двойной точности числу обычной точности):
ПРИМЕЧАНИЕ При вычислении выражений, в которых участвуют числа с плавающей точкой, более предпочтительным является использование типа double, так как это позволяет обеспечить большую точность вычисления. Числа типа float чаще применяются для определения больших массивов и для сохранения информации на диске, то есть там, где критичным является объем памяти, занимаемой данными. doubleТип double используется для восьмибайтных чисел с плавающей точкой. Область изменения чисел этого типа от -1.7*10+308 до -1.7*10-308 и от 1.7*10-308 до 1.7*10+308, при этом обеспечивается точность 15 десятичных цифр (точность вычисления и область изменения чисел этого типа зависят от версии компилятора, информация о них находится в файлах limits.h и float.h).
По умолчанию все константы, не являющиеся целыми числами, сохраняются в виде чисел двойной точности:
long doubleЕдинственное, что можно точно сказать о числах, объявленных числами этого типа, - они занимают не меньше места в памяти, чем числа типа double, а следовательно, обеспечивают не меньшую точность. Все остальное зависит от компилятора, поэтому этот тип следует применять только после внимательного изучения возможностей используемого компилятора, особенно в том случае, если необходимо обеспечить переносимость программного продукта. wchar_tТип wchar_t используется для хранения символов, занимающих два байта (например, в стандарте Unicode). В связи с тем, что каждый символ этого типа занимает два байта, для формирования строк из него рекомендуются специальные функции. При отсутствии таких функций придется использовать присваивание для каждого символа:
ПРИМЕЧАНИЕ В ранних версиях С++ этот тип не поддерживался |
|
![]() |
|
![]() |
|
![]() |
|
издательство | каталог | отдел сбыта | обратная связь | webmaster![]() ![]() Авторские права охраняются. Воспроизведение материалов или их частей в любом виде без письменного разрешения запрещено! © 1997-2004, Издательский дом "Питер" |
![]() Санкт-Петербург пр. Бол. Сампсониевский 29а тел. (812)-703-7374 Москва тел. (095)-777-5467 e-mail: sales@piter.com, postbook@piter.com http://www.piter.com |