Числа
Цель лекции
Получение знаний по работе с числами всех типов, преобразование чисел в другие типы данных, закрепление материала на практике.
Целые числа
В Lazarus (а точнее, в Free Pascal), как и в любом другом языке программирования, числа играют довольно важную роль. Трудно представить себе программу, в которой не использовались бы числа. Даже когда вы просто установите какой-то компонент на форму, автоматически начинают действовать множество настроек. Left, Top, Height, Width - все эти свойства есть в любом визуальном компоненте, и они содержат числа. Числа бывают целые и вещественные, знаковые и беззнаковые.
В этом разделе поговорим о целых числах, как знаковых, так и беззнаковых. Что такое целое число? Это число без запятой, то есть, без десятичной части. Знаковым называют число со знаком: -1, например. Беззнаковое число - это число от нуля и больше.
В программировании базовым целым числом является integer, который мы уже не раз использовали. Но вы, вероятно, догадались, что это не единственный возможный целый тип? Есть разные типы целых чисел, они могут быть со знаком и без него, имеют разный диапазон возможных значений и, соответственно, занимают разный размер оперативной памяти. Разберем эти типы:
Тип | Диапазон | Размер в байтах |
---|---|---|
Byte | 0…255 | 1 |
ShortInt | -128…127 | 1 |
Word | 0…65 535 | 2 |
Smallint | -32 768…32 767 | 2 |
LongWord | 0…4 294 967 295 | 4 |
Cardinal | 0…4 294 967 295 | 4 |
LongInt | -2 147 483 648…2 147 483 647 | 4 |
Integer | -2 147 483 648…2 147 483 647 | 4 |
Int64 | 8 |
Обратите внимание, здесь диапазон и размер Integer совпадает с LongInt. Вообще-то, это зависит от режима компилятора FPC. Проект можно скомпилировать в разных режимах, с поддержкой Delphi, например, или TP (Turbo Pascal). По умолчанию, выставлен режим Object Pascal, это можно проверить, выполнив в среде Lazarus команду меню Проект -> Параметры проекта, затем в разделе Параметры компилятора выбрать Обработка. В верхней части там указан Режим синтаксиса, по умолчанию это Object Pascal, но при необходимости его можно и поменять.
Так вот, если там выставлен режим Object Pascal или Delphi, тогда Integer имеет размер 32 бита, или 4 байта. Если же выставлен старый режим Turbo Pascal или Free Pascal, то Integer будет иметь размер в 16 бит или 2 байта, и будет соответствовать типу Smallint.
Зачем нужно такое разнообразие целых типов? В былые времена оперативная память была довольно маленькой. Если сейчас у меня на ПК установлена оперативная память 4 Гб, то когда-то давно я был вынужден обходиться компьютером с процессором 486 и оперативкой аж в 16 мегабайт, и можете поверить, это был далеко не самый худший компьютер! В те времена программисты сражались за каждый байт памяти, переписывая и минимизируя код, выбирая самые маленькие из возможных типы данных. Это называлось оптимизацией кода. Допустим, вам нужно выполнить какой-то цикл 10 раз. Для подсчета шагов цикла вам придется создать переменную целого типа. Но зачем использовать переменную Integer в 4 байта, когда вполне можно обойтись однобайтовым Byte? Сейчас конечно, это не играет такой большой роли, как прежде, но всё равно, оптимизация кода - это признак хорошего программиста, это хороший тон в программировании. Так что старайтесь не тратить понапрасну лишнюю память.
Рекомендации тут следующие: если вы знаете, что число будет без знака, то и выбирайте беззнаковые типы. Если вы точно знаете, что максимальное число в переменной будет маленьким, выбирайте типы поменьше. Если вам неизвестно, какого размера число попадет в переменную, то выбирайте Integer - это универсальный тип, годный для большинства случаев. Ну а если вы уверены, что число будет очень большим, то используйте 4-х или даже 8-ми байтовые типы.
Вещественные числа
Вещественными называются числа с дробной частью, причем, если дробная часть равна нулю, её все равно нужно указать. Например:
Такие числа еще называют числами с плавающей точкой, поскольку количество цифр после точки может быть различным. Записываются вещественные числа по определенным правилам. Если в математике мы дробную часть отделяем запятой, в Lazarus для этого используют точку. При указании очень большого числа можно выбрать сокращенную форму. Если в математике для этого число умножают на десятичную степень, например,
то в Lazarus вместо 10 указывают букву E (от англ. exponent - показатель степени):
Степени могут быть и отрицательными:
Вещественных типов тоже много. В характеристике вещественных чисел роль играет не только размер, занимаемый в памяти, но и количество значащих цифр:
Тип | Диапазон | Количество значащих цифр | Размер в байтах |
---|---|---|---|
Single | 1.5E-45…3.4E38 | 7-8 | 4 |
Real | 5.0E-324…1.7E308 | 15-16 | 8 |
Double | 5.0E-324…1.7E308 | 15-16 | 8 |
Comp | -2E64+1…2E63-1 | 19-20 | 8 |
Currency | -922 337 203 685 477.5808 … 922 337 203 685 477.5807 | 19-20 | 8 |
Extended | 1.9E-4932…1.1E4932 | 19-20 | 10 |
Как видите, вещественные числа куда больше целых, процессорного времени на обработку таких чисел тратится тоже больше. Поэтому вещественные числа имеет смысл применять только по необходимости, когда целыми числами явно не обойтись. Не слушайте тех, кто предлагает на все случаи жизни использовать тип Real - и для целых, и для вещественных чисел.
Рекомендации тут такие же, как и для целых чисел - выбирайте типы по необходимости. Особо выделю тип Currency - его создали специально для финансовых расчетов, поэтому для всякого рода бухгалтерских расчетов лучше выбирать именно этот тип, как наиболее точный. Но чаще всего обходятся типом Real (или Double).
Операции над целыми и вещественными числами
Целые числа можно складывать (+), отнимать (-) и умножать (*) друг на друга. С делением дело обстоит сложней. Допустим, нам нужно 10 разделить на 3. Получится 3,33333…, а это уже не целое число. Поэтому для целых чисел в Паскале предусмотрено деление нацело. Операция div обеспечивает деление нацело, и возвращает целую часть, отбрасывая дробную. Например, 10 разделить на 8 будет равно 1,25. Если применить целочисленное деление, то 10 div 8 = 1. Чтобы узнать остаток от такого деления, применяют операцию mod. 10 mod 8 = 2.
Арифметика над вещественными числами еще проще, здесь применяют следующие стандартные операции: + (сложение), - (вычитание), * (умножение), / (деление).
Кроме того, как целые, так и вещественные числа можно сравнивать между собой, используя для этого логические операторы: = (равно), <> (не равно), > (больше), < (меньше), >= (больше или равно), <= (меньше или равно).
Очень часто приходится использовать большие и сложные выражения, где вместе с арифметическими используются и логические операторы. Здесь главное - не забывать о приоритетах. Возьмем выражение
Что попадет в переменную r? Если вы ответили 11, то вы правы. Чтобы сначала выполнить сложение, его нужно поместить в скобки, которые имеют высший приоритет:
В этом случае, в переменную r попадет число 14.
Порядок | Операции |
---|---|
1 | ( ) - То, что в круглых скобках, вычисляется в первую очередь |
2 | NOT |
3 | *, /, DIV, MOD, AND |
4 | +, -, OR, XOR |
5 | =, <>, >, <, >=, <= |