Pascal. Типы данных. Стандартные типы данных. Целые типы. Порядковые типы

Типы данных. Стандартные типы данных. Целые типы. Порядковые типы. Функции Ord, Pred, Succ. Функция SizeOf


Содержание


Поиск на других ресурсах:

1. Понятие типа данных. Группы типов данных

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

Язык программирования Паскаль позволяет использовать набор типов, которые делятся на две группы:

  • стандартные (предопределенные) типы;
  • пользовательские типы. Это типы, определяемые пользователем (программистом).

Стандартные типы имеют строго определенные имена и доступны в любой точке программы. Все стандартные типы описываются в модуле System. Для использования стандартных типов в программе не требуется подключать модуль System в разделе uses, поскольку этот модуль подключается по умолчанию. Стандартные типы доступны в любом модуле программы.

Разрешается переопределять имена стандартных типов в программе. Также доступ к типу можно получить путем использования имени модуля System как показано ниже

System.LongInt
System.Real
System.Boolean
System.Char

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

В языке Паскаль различают следующие пользовательские типы:

  • перечисляемый тип;
  • интервальный тип;
  • указательные типы (кроме стандартного типа Pointer);
  • структурированные типы;
  • объектные типы.

 

2. Классификация стандартных типов

В разных версиях Паскаля имена и количество типов изменяются. Различают типы базового Паскаля и дополнительные типы, добавленные в новых последующих версиях и разновидностях этого языка: Delphi (Object Pascal), Lazarus, PascalABC.

К стандартным типам языка Паскаль относятся:

  • целые типы ShortInt, Integer, LongInt, Byte, Word;
  • вещественные типы Single, Real, Double, Extended, Comp;
  • булевые типы Boolean, ByteBool, WordBool, LongBool;
  • символьный тип Char;
  • строчные типы String, PChar;
  • указательный тип (тип указателя) Pointer;
  • текстовый тип Text.

В языке Free Pascal были добавлены новые стандартные типы:

  • целые типы SmallInt, Cardinal, LongWord, Int64, QWord;
  • вещественный тип Currency;
  • символьный тип WideChar.

В языке Delphi добавлены следующие типы:

  • целые типы SmallInt, Cardinal, LongWord, Int64, UInt64, NativeInt, NativeUint;
  • вещественные типы Real48, Currency.

 

3. Порядковые типы. Понятия. Характеристики порядковых типов. Функции Ord, Pred, Succ

К порядковым типам данных относятся следующие стандартные типы:

  • целые типы ShortInt, Integer, LongInt, Byte, Word, SmallInt, Cardinal, LongWord, Int64, QWord;
  • булевые типы Boolean, ByteBool, WordBool, LongBool;
  • символьные типы Char, WideChar.

Для порядковых типов можно определить следующие свойства.

  • для каждого порядкового типа определено множество допустимых значений, являющихся упорядоченной последовательностью. Каждый элемент порядкового типа имеет свой порядковый номер, представленный целым числом. Первое значение в порядковых типах Byte, Word, Boolean, ByteBool, WordBool, LongBool имеет порядковый номер 0, далее следует порядковый номер 1 и т.д. В порядковых типах ShortInt, Integer, LongInt порядковый номер равен значению этих типов;
  • для любого порядкового типа применима стандартная функция Ord, определяющая порядковый номер этого значения;
  • для любого порядкового типа применима стандартная функция Pred, которая возвращает предыдущее значение относительно заданного значения. Если функция Pred применяется к первому допустимому значению порядкового типа (кроме булевых типов), то возвращается порядковый номер последнего значения;
  • любой порядковый тип может быть использован в стандартной функции Succ, возвращающей значение которое следует за указанным. Если эта функция применяется к последнему допустимому значению порядкового типа (кроме булевых типов), то возвращается порядковый номер первого значения.

 

4. Пример, демонстрирующий использование порядковых типов в сочетании с функциями Pred, Succ

В примере приводится использование функций Pred, Succ для стандартных типов классического Паскаля. Эти функции также могут использоваться для новых типов языка Free Pascal.

program TestOrdinalTypes;

uses
  crt;

var
  // Объявление переменных порядковых типов
  // 1. Группа целых типов
  i, pred_i, succ_i : Integer;
  bt, pred_bt, succ_bt : Byte;
  si, pred_si, succ_si : ShortInt;
  li, pred_li, succ_li : LongInt;
  w, pred_w, succ_w : Word;

  // 2. Булевые типы
  b, pred_b, succ_b : Boolean;
  bb, pred_bb, succ_bb : ByteBool;
  wb, pred_wb, succ_wb : WordBool;
  lb, pred_lb, succ_lb : LongBool;

  // 3. Тип Char
  c, pred_c, succ_c : Char;

begin
  // 1. Группа целых типов
  // 1.1. Тип Integer
  i:=25;
  pred_i := Pred(i); // 24
  succ_i := Succ(i); // 26
  Writeln('Integer: ', pred_i:6, i:6, succ_i:6);

  // 1.2. Тип Byte
  bt:=0;
  pred_bt := Pred(bt); // 255
  succ_bt := Succ(bt); // 1
  Writeln('Byte:   ', pred_bt:6, bt:6, succ_bt:6);

  // 1.3. Тип ShortInt
  si:=-1;
  pred_si := Pred(si); // -2
  succ_si := Succ(si); // 0
  Writeln('ShortInt:', pred_si:6, si:6, succ_si:6);

  // 1.4. Тип LongInt
  li:=0;
  pred_li := Pred(li);
  succ_li := Succ(li);
  Writeln('LongInt: ', pred_li:6, li:6, succ_li:6);

  // 1.5. Тип Word
  w := 0;
  pred_w := Pred(w); // 65535
  succ_w := Succ(w); // 1
  Writeln('Word:   ', pred_w:6, w:6, succ_w:6);

  // 2. Булевые типы
  // 2.1. Тип Boolean
  b:=True;
  pred_b := Pred(b); // False
  succ_b := Succ(b); // True
  Writeln('Boolean: ', pred_b:6, b:6, succ_b:6);

  // 2.2. Тип WordBool
  wb:=False;
  pred_wb := Pred(wb); // True
  succ_wb := Succ(wb); // True
  Writeln('WordBool:', pred_wb:6, wb:6, succ_wb:6);

  // 2.3. Тип ByteBool
  bb:=True;
  pred_bb := Pred(bb); // True
  succ_bb := Succ(bb); // False
  Writeln('ByteBool:', pred_bb:6, bb:6, succ_bb:6);

  // 2.4. Тип LongBool
  lb:=False;
  pred_lb := Pred(lb); // True
  succ_lb := Succ(lb); // True
  Writeln('LongBool:', pred_lb:6, lb:6, succ_lb:6);

  // 3. Символьный тип Char
  c:='D';
  pred_c := Pred(c);
  succ_c := Succ(c);
  Writeln('Char:   ', pred_c:6, c:6, succ_c:6);
end.

Результат выполнения программы

Integer:     24   25     26
Byte:       255     0     1
ShortInt:   -2   -1     0
LongInt:     -1     0     1
Word:     65535     0     1
Boolean: FALSE TRUE   TRUE
WordBool: TRUE FALSE TRUE
ByteBool: TRUE TRUE FALSE
LongBool: TRUE FALSE TRUE
Char:         C     D     E

 

5. Целые типы. Характеристики целых типов в стандартном Паскале и Free Pascal

В таблице 1 отображаются характеристики целых типов, реализуемых в стандартном Паскале.

Описание типа (назначение)

Обозначение в программе

Диапазон представления чисел Размер памяти
Краткое целое со знаком ShortInt -128 .. 127 1 байт
Целое со знаком Integer -32768 .. 32767 2 байта
Длинное целое со знаком LongInt -2147483648..2147483647 4 байта
Краткое целое без знака Byte 0 .. 255 1 байт
Целое без знака Word 0 .. 65535 2 байта

Рисунок 1. Характеристики целых типов в языке Паскаль

К числу важных характеристик типа относятся размер памяти в байтах и диапазон представления чисел. Размер памяти определяет, сколько байт будет выделено для сохранения одной переменной или константы в памяти. Если объявить переменную типа LongInt, то для ее сохранения будет выделено 4 байта памяти.

В Free Pascal в перечень целых типов были внесены изменения (см. таблицу 2), а именно:

  • добавлены дополнительные типы SmallInt, Cardinal, LongWord, Int64, QWord;
  • тип Integer может занимать память 2 или 4 байта с целью обеспечения совместимости между 16-битными словами и 32-битными словами, реализованными в разных поколениях процессоров.

Таблица 2 содержит дополнительные целочисленные типы, добавленные в языке Free Pascal.

Обозначение в программе

Диапазон представления чисел

Размер памяти, байт

SmallInt -32768 .. 32767 2
Cardinal 0 .. 4294967295 так же как LongWord 4
LongWord 0..4294967295 4
Int64 -9223372036854775808..9223372036854775807 8

QWord или UInt64

0 .. 65535 8

В языке Delphi добавлены следующие целочисленные типы: SmallInt, Cardinal, LongWord, Int64, UInt64, NativeInt, NativeUint. Эти типы имеют такие же характеристики как одноименные типы из таблицы 2. Тип NativeInt имеет такие же характеристики, как тип LongInt. Тип NativeUint соответствует типу LongWord.

 

6. Пример объявления и использования переменных целых типов

Ниже приводится фрагмент объявления переменных и констант целых типов стандартного Паскаля.

program TestOrdinalTypes;

uses
  crt;

// Объявление констант целых типов
const
  Max = 300;
  Min = 0;
  NumberDays = 7;

// Объявление переменных целых типов
var
  s:ShortInt;
  i:Integer;
  l:LongInt;
  b:Byte;
  w:Word;

begin
  // Присваивание значений переменным типов ShortInt, Integer, LongInt
  s := -35;
  Writeln(s);

  i := 2021;
  Writeln(i);
  l := 3000000;
  Writeln(l);

  // Попытка присваивания переменной значения,
  // которое превышает ее допустимые границы.
  b:=2000; // b = 208 - переполнение
  Writeln(b);

  // Присваивание значения переменной типа Word
  w := 65000;
  Writeln(w);
end.

Результат выполнения программы

-35
2021
3000000
208
65000

 

7. Программное определение минимально допустимых и максимально допустимых значений целых типов. Пример

Для некоторых типов существуют предопределенные константы, определяющие минимально допустимое или максимально допустимое значение, которое может получить переменная некоторого типа. В разных языках (Free Pascal, Delphi, PascalABC) список этих констант может отличаться.

Ниже приведен пример использования констант MaxInt и MaxLongInt в системах Delphi и Lazarus

// Вывести максимальное значение типов Integer и LongInt
Writeln(System.MaxInt);     // 2147483647
Writeln(System.MaxLongint); // 2147483647

 

8. Программное определение размера типа. Функция SizeOf. Пример

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

SizeOf(variableName_or_constantName);

или

SizeOf(typeName);

здесь

  • variableName_or_constantName – имя переменной или константы, для которой нужно определить размер памяти, выделенный для нее;
  • typeName – имя типа, для которого определяется размер.

Пример.

program TestTypes;

uses
  crt;

// Объявление констант
const
  Pi = 3.1415;

// Объявление переменных
var
  i:Integer;
  d:Double;
  qw:QWord;
  size:Integer;

begin
  // Функция SizeOf - определить размер переменной или типа
  // 1. Получить размер переменной i
  size := SizeOf(i); // size = 4
  Writeln('SizeOf(i) = ', size);

  // 2. Получить размер переменной qw
  size := SizeOf(qw); // size = 8
  Writeln('SizeOf(qw) = ', size);

  // 3. Получить размер типа LongInt
  size := SizeOf(LongInt); // size = 4
  Writeln('SizeOf(LongInt) = ', size);

  // 4. Вывести размеры других типов
  Writeln('SizeOf(Currency) = ', SizeOf(Currency)); // 8
  Writeln('SizeOf(SmallInt) = ', SizeOf(SmallInt)); // 2

  // 5. Получить размер константы Pi
  Writeln('SizeOf(Pi) = ', SizeOf(Pi)); // 8
end.

Результат выполнения программы

SizeOf(i) = 4
SizeOf(qw) = 8
SizeOf(LongInt) = 4
SizeOf(Currency) = 8
SizeOf(SmallInt) = 2
SizeOf(Pi) = 8

 


Связанные темы