Стандартные типы данных Delphi
К стандартным относятся целые, действительные, логические, символьный и адресный типы.
Целые типы определяют константы, переменные и функции, значения которых реализуются множеством целых чисел, допустимых в данной ЭВМ.
Тип |
Диапазон значений |
Требуемая память |
Shortint |
-128 .. 127 |
1 байт |
Integer |
-32768 .. 32767 |
2 байта |
Longint |
-2147483648 .. 2147483647 |
4 байта |
Byte |
0 .. 255 |
1 байт |
Word |
0 .. 65535 |
2 байта |
Над целыми операндами можно выполнять следующие арифметические операции:
-
сложение +,
-
вычитание -,
-
умножение *,
-
деление div,
-
получение остатка от деления mod.
Результат арифметической операции над целыми операндами есть величина целого типа. Результат выполнения операции деления целых величин есть целая часть частного. Результат выполнения операции получения остатка от деления – остаток от деления целых. Например:
17 div 2 = 8, 3 div 5 = 0,
17 mod 2 = 1, 3 mod 5 = 3.
Операции отношения, примененные к целым операндам, дают результат логического типа TRUE или FALSE (истина или ложь).
В языке Паскаль имеются следующие операции отношения:
-
равенство =,
-
неравенство <>,
-
больше или равно >=,
-
меньше или равно <=,
-
больше >,
-
меньше < .
К аргументам целого типа применимы следующие стандартные (встроенные) функции, результат выполнения которых имеет целый тип:
Abs(X), Sqr(X), Succ(X), Pred(X),
и которые определяют соответственно абсолютное значение Х, Х в квадрате, Х+1, Х-1.
Следующая группа стандартных функций для аргумента целого типа дает действительный результат:
Sin(X), Cos(X), ArcTan(X), Ln(X), Exp(X), Sqrt(X).
Эти функции вычисляют синус, косинус и арктангенс угла, заданного в радианах, логарифм натуральный, экспоненту и корень квадратный соответственно.
Результат выполнения функции проверки целой величины на нечетность Odd(X) имеет значение истина, если аргумент нечетный, и значение ложь, если аргумент четный:
X=5 Odd(X)=TRUE, X=4 Odd(X)=FALSE.
Для быстрой работы с целыми числами определены процедуры:
Inc(X) <=> X:=X+1
Inc(X,N)<=> X:=X+N
Dec(X) <=> X:=X-1
Dec(X,N)<=> X:=X-N
Действительные типы определяют те данные, которые реализуются подмножеством действительных чисел, допустимых в данной ЭВМ.
Тип |
Диапазон значений |
Количество цифр мантиссы |
Требуемая память (байт) |
Real |
2.9e-39 ... 1.7e+38 |
11 |
6 |
Single |
1.5e-45 ... 3.4e+38 |
7 |
4 |
Double |
5.0e-324 ... 1.7e+308 |
15 |
8 |
Extended |
3.4e-4932 ... 1.1e+4932 |
19 |
10 |
Comp |
-9.2e+18 ... 9.2e+18 |
19 |
8 |
Тип Real определен в стандартном Паскале и математическим сопроцессором не поддерживается.
Остальные действительные типы определены стандартом IEEE 457 и реализованы на всех современных компьютерах.
Для их использования при наличии сопроцессора или при работе на ЭВМ типа 80486 необходимо компилировать программу с ключом {$ N+}, а при отсутствии сопроцессора – с ключами {$N-,E+}.
Тип Comp хотя и относится к действительным типам, хранит только длинные целые значения.
Над действительными операндами можно выполнять следующие арифметические операции, дающие действительный результат:
сложение +, вычитание -, умножение *, деление /.
К величинам действительного типа применимы все операции отношения, дающие булевский результат.
Один из операндов, участвующих в этих операциях, может быть целым.
К действительным аргументам применимы функции, дающие действительный результат:
Abs(X), Sqr(X), Sin(X), Cos(X), ArcTan(X), Ln(X), Exp(X), Sqrt(X), Frac(X), Int(X), Pi.
Функция Frac(X) возвращает дробную часть X, функция Int(X) – целую часть X. Безаргументная функция Pi возвращает значение числа p действительного типа.
К аргументам действительного типа применимы также функции Trunc(X) и Round(X), дающие целый результат. Первая из них выделяет целую часть действительного аргумента путем отсечения дробной части, вторая округляет аргумент до ближайшего целого.
Логический тип (Boolean) определяет те данные, которые могут принимать логические значения TRUE и FALSE.
К булевским операндам применимы следующие логические операции:
not and or xor.
Логический тип определен таким образом, что FALSE < TRUE. Это позволяет применять к булевским операндам все операции отношения.
В Турбо Паскаль введены еще разновидности логического типа: ByteBool, WordBool и LongBool, которые занимают в памяти ЭВМ один, два и четыре байта соответственно.
Символьный тип (Char) определяет упорядоченную совокупность символов, допустимых в данной ЭВМ. Значение символьной переменной или константы – это один символ из допустимого набора.
Символьная константа может записываться в тексте программы тремя способами:
– как один символ, заключенный в апострофы, например:
'A' 'a' 'Ю' 'ю';
– с помощью конструкции вида #K, где K – код соответствующего символа, при этом значение K должно находиться в пределах 0…255;
– с помощью конструкции вида ^C, где C – код соответствующего управляющего символа, при этом значение C должно быть на 64 больше кода управляющего символа.
К величинам символьного типа применимы все операции отношения.
Для величин символьного типа определены две функции преобразования
Ord(C), Chr(K).
Первая функция определяет порядковый номер символа С в наборе символов, вторая определяет по порядковому номеру К символ, стоящий на К-м месте в наборе символов. Порядковый номер имеет целый тип.
К аргументам символьного типа применяются функции, которые определяют предыдущий и последующий символы:
Pred(C), Succ(C), Pred('F') = 'E', Succ('Y') = 'Z'.
При отсутствии предыдущего или последующего символов значение соответствующих функций не определено.
Для литер из интервала 'a'…'z' применима функция UpCase(C), которая переводит эти литеры в верхний регистр 'A'…'Z'.
Адресный тип (Pointer)
определяет переменные, которые могут содержать значения адресов данных
или фрагментов программы. Для хранения адреса требуются два слова (4
байта), одно из них определяет сегмент,
второе – смещение.
Работа с адресными переменными (указателями) будет рассмотрена позже, сейчас отметим, что для получения значения адреса какой-либо переменной введена унарная операция @.
Типы данных С++
В
этой главе приводится обзор встроенных, или элементарных, типов данных
языка С++. Она начинается с определения литералов, таких, как 3.14159
или pi, а затем вводится понятие переменной, или объекта, который должен
принадлежать к одному из типов данных. Оставшаяся часть главы посвящена
подробному описанию каждого встроенного типа. Кроме того, приводятся
производные типы данных для строк и массивов, предоставляемые
стандартной библиотекой С++. Хотя эти типы не являются элементарными,
они очень важны для написания настоящих программ на С++.
Литералы
В С++
имеется набор встроенных типов данных для представления целых и
вещественных чисел, символов, а также тип данных "символьный массив”,
который служит для хранения символьных строк. Тип char служит для
хранения отдельных символов и небольших целых чисел. Он занимает один
машинный байт. Типы short, int и long предназначены для представления
целых чисел. Эти типы различаются только диапазоном значений, которые
могут принимать числа, а конкретные размеры перечисленных типов зависят
от реализации. Обычно short занимает половину машинного слова, int –
одно слово, long – одно или два слова. В 32-битных системах int и long,
как правило, одного размера.
Типы float, double и long double
предназначены для чисел с плавающей точкой и различаются точностью
представления (количеством значащих разрядов) и диапазоном. Обычно float
(одинарная точность) занимает одно машинное слово, double (двойная
точность) – два, а long double (расширенная точность) – три.
char,
short, int и long вместе составляют целые типы, которые, в свою очередь,
могут быть знаковыми (signed) и беззнаковыми (unsigned). В знаковых
типах самый левый бит служит для хранения знака (0 – плюс, 1 – минус), а
оставшиеся биты содержат значение. В беззнаковых типах все биты
используются для значения. 8-битовый тип signed char может представлять
значения от -128 до 127, а unsigned char – от 0 до 255.
Когда в
программе встречается некоторое число, например 1, то это число
называется литералом, или литеральной константой. Константой, потому что
мы не можем изменить его значение, и литералом, потому что его значение
фигурирует в тексте программы. Литерал является неадресуемой величиной:
хотя реально он, конечно, хранится в памяти машины, нет никакого
способа узнать его адрес. Каждый литерал имеет определенный тип. Так, 0
имеет тип int, 3.14159 – тип double.
Литералы целых типов можно
записать в десятичном, восьмеричном и шестнадцатеричном виде. Вот как
выглядит число 20, представленное десятичным, восьмеричным и
шестнадцатеричным литералами:
20 // десятичный
024 // восьмеричный
0х14 // шестнадцатеричный
Если
литерал начинается с 0, он трактуется как восьмеричный, если с 0х или
0Х, то как шестнадцатеричный. Привычная запись рассматривается как
десятичное число.
По умолчанию все целые литералы имеют тип signed
int. Можно явно определить целый литерал как имеющий тип long, приписав в
конце числа букву L (используется как прописная L, так и строчная l,
однако для удобства чтения не следует употреблять строчную: ее легко
перепутать с
1). Буква U (или u) в конце определяет литерал как unsigned int, а две буквы – UL или LU – как тип unsigned long. Например:
128u 1024UL 1L 8Lu
Литералы,
представляющие действительные числа, могут быть записаны как с
десятичной точкой, так и в научной (экспоненциальной) нотации. По
умолчанию они имеют тип double. Для явного указания типа float нужно
использовать суффикс F или f, а для long double - L или l, но только в
случае записи с десятичной точкой. Например:
3.14159F 0/1f 12.345L 0.0
3el 1.0E-3E 2. 1.0L
Слова true и false являются литералами типа bool.
Представимые литеральные символьные константы записываются как символы в одинарных кавычках. Например:
'a' '2' ',' ' ' (пробел)
Специальные
символы (табуляция, возврат каретки) записываются как
escape-последовательности . Определены следующие такие
последовательности (они начинаются с символа обратной косой черты):
новая строка \n
горизонтальная табуляция \t
забой \b
вертикальная табуляция \v
возврат каретки \r
прогон листа \f
звонок \a
обратная косая черта \\
вопрос \?
одиночная кавычка \'
двойная кавычка \"
escape-последовательность
общего вида имеет форму \ooo, где ooo – от одной до трех восьмеричных
цифр. Это число является кодом символа. Используя ASCII-код, мы можем
написать следующие литералы:
\7 (звонок) \14 (новая строка)
\0 (null) \062 ('2')
Символьный
литерал может иметь префикс L (например, L'a'), что означает
специальный тип wchar_t – двухбайтовый символьный тип, который
применяется для хранения символов национальных алфавитов, если они не
могут быть представлены обычным типом char, как, например, китайские или
японские буквы.
Строковый литерал – строка символов, заключенная в
двойные кавычки. Такой литерал может занимать и несколько строк, в этом
случае в конце строки ставится обратная косая черта. Специальные символы
могут быть представлены своими escape-последовательностями. Вот примеры
строковых литералов:
"" (пустая строка)
"a"
"\nCC\toptions\tfile.[cC]\n"
"a multi-line \
string literal signals its \
continuation with a backslash"
Фактически
строковый литерал представляет собой массив символьных констант, где по
соглашению языков С и С++ последним элементом всегда является
специальный символ с кодом 0 (\0).
Литерал 'A' задает единственный символ А, а строковый литерал "А" – массив из двух элементов: 'А' и \0 (пустого символа).
Раз существует тип wchar_t, существуют и литералы этого типа, обозначаемые, как и в случае с отдельными символами, префиксом L:
L"a wide string literal"
Строковый литерал типа wchar_t – это массив символов того же типа, завершенный нулем.
Если
в тесте программы идут подряд два или несколько строковых литералов
(типа char или wchar_t), компилятор соединяет их в одну строку.
Например, следующий текст
"two" "some"
породит массив из
восьми символов – twosome и завершающий нулевой символ. Результат
конкатенации строк разного типа не определен. Если написать:
// this is not a good idea
"two" L"some"
то
на каком-то компьютере результатом будет некоторая осмысленная строка, а
на другом может оказаться нечто совсем иное. Программы, использующие
особенности реализации того или иного компилятора или операционной
системы, являются непереносимыми.