Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по информатике.doc
Скачиваний:
22
Добавлен:
22.04.2019
Размер:
469.5 Кб
Скачать

Тема №1 Типы данных, преобразование типов

Целые типы

integer

2 -32768..32767 +, -, /, *, Div, Mod,>=, <=, =, <>, <, >

byte

1 0..255 +, -, /, *, Div, Mod,>=, <=, =, <>, <, >

word

2 0..65535 +, -, /, *, Div, Mod,>=, <=, =, <>, <, >

shortint

1 -128..127 +, -, /, *, Div, Mod,>=, <=, =, <>, <, >

longint

4 -2147483648..2147483647 +, -, /, *, Div, Mod,>=, <=, =, <>, <, >

Вещественные типы

real

6 2,9x10-39 - 1,7x1038 +, -, /, *,>=, <=, =, <>, <, >

single

4 1,5x10-45 - 3,4x1038 +, -, /, *,>=, <=, =, <>, <, >

double

8 5x10-324 - 1,7x10308 +, -, /, *,>=, <=, =, <>, <, >

extended

10 3,4x10-4932 - 1,1x10493 +, -, /, *,>=, <=, =, <>, <, >

Логический тип

boolean1 true, false Not, And, Or, Xor,>=, <=, =, <>, <, >

Символьный тип

char

1 все символы кода ASCII +,>=, <=, =, <>, <, >

Порядковые типы, выделяемые из группы простых типов, характеризуются следующими свойствами:

все возможные значения порядкового типа представляют собой ограниченное упорядоченное множество;

к любому порядковому типу может быть применена стандартная функция Ord, которая в качестве результата возвращает порядковый номер конкретного значения в данном типе;

к любому порядковому типу могут быть применены стандартные функции Pred и Succ, которые возвращают предыдущее и последующее значения соответственно;

к любому порядковому типу могут быть применены стандартные функции Low и High, которые возвращают наименьшее и наибольшее значения величин данного типа.

В языке Паскаль введены понятия эквивалентности и совместимости типов. Два типа Т1 и Т2 являются эквивалентными (идентичными), если выполняется одно из двух условий:

Т1 и Т2 представляют собой одно и то же имя типа;

тип Т2 описан с использованием типа Т1 с помощью равенства или последовательности равенств. Например:

type

T1 = Integer;

T2 = T1;

T3 = T2;

Менее строгие ограничения накладываются на совместимость типов. Так, типы являются совместимыми, если:

они эквивалентны;

являются оба либо целыми, либо действительными;

один тип - интервальный, другой - его базовый;

оба интервальные с общим базовым;

один тип - строковый, другой - символьный.

В Турбо Паскаль ограничения на совместимость типов можно обойти с помощью приведения типов. Приведение типов позволяет рассматривать одну и ту же величину в памяти ЭВМ как принадлежащую разным типам. Для этого используется конструкция

Имя_Типа(переменная или значение)

Напрмер, Integer('Z') представляет собой значение кода символа 'Z' в двухбайтном представлении целого числа, а Byte(534) даст значение 22, поскольку целое число 534 имеет тип Word и занимает два байта, а тип Byte занимает один байт, и в процессе приведения старший байт будет отброшен.

Преобразование: В программе данные одного типа могут преобразовываться в данные другого типа. Такое преобразование может быть явным или неявным.

При явном преобразовании типов используются вызовы специальных функций преобразования, аргументы которых принадлежат одному типу, а значение - другому. Таковыми являются уже рассмотренные функции ORD, TRUNC, ROUND, CHR. В гл. 6 описывается функция PTR, преобразующая четырехбайтный целочисленный аргумент к типу-указателю.

В Турбо Паскале может использоваться и более общий механизм преобразования типов, согласно которому преобразование достигается применением идентификатора имени) стандартного типа или типа, определенного пользователем, как идентификатора функции преобразования к выражению преобразуемого типа (так называемое автоопределенное преобразование типов). Например, допустимы следующие вызовы функций:

type

МуТуре = (а, Ь, с, d);

.....

МуТуре (2)

Integer ('D')

pointer (longint(a)+ $FF)

Char (127 mod c)

Byte (k)

При автоопределенном преобразовании типа выражения может произойти изменение длины его внутреннего представления (длина может увеличиться или уменьшиться).

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

type

byt = array [1..2] of Byte;

int = array [1..2] of Integer;

rec = record

x, у : Integer

end;

var

vbyt : byt;

vint : int;

vrec : rec;

begin

byt(vint[1])[2] := 0;

int(vrec)[1] := 256

end.

Неявное преобразование типов возможно только в двух случаях:

в выражениях, составленных из вещественных и целочисленных переменных, последние автоматически преобразуются к вещественному типу, и все выражение в целом приобретает вещественный тип;

одна и та же область памяти попеременно трактуется как содержащая данные то одного, то другого типа (совмещение в памяти данных разного типа).

Совмещение данных в памяти может произойти при использовании записей с вариантными полями (см. 4.2.2), типизированных указателей, содержащих одинаковый адрес (см. гл. 6), а также при явном размещении данных разного типа по одному и тому же абсолютному адресу. Для размещения переменной по нужному абсолютному адресу она описывается с последующей стандартной директивой ABSOLUTE, за которой помещается либо абсолютный адрес, либо идентификатор ранее определенной переменной. Абсолютный адрес указывается парой чисел типа WORD, разделенных двоеточием; первое число трактуется как сегмент, второе - как смещение адреса (см. гл. 6). Например:

b : Byte absolute $0000:$0055; w : Longlnt absolute 128:0;

Если за словом ABSOLUTE указан идентификатор ранее определенной переменной, то происходит совмещение в памяти данных разного типа, причем первые байты внутреннего представления этих данных будут располагаться по одному и тому же абсолютному адресу, например:

var

х : Real;

у : array [1..3] of Integer absolute x;

В этом примере переменные X и Y будут размещены, начиная с одного и того же абсолютного адреса. Таким образом, одну и ту же область памяти длиной 6 байт, а следовательно, и размещенные в этой области данные теперь можно рассматривать как данные либо типа REAL, либо как массив из трех данных типа INTEGER. Например, следующая программа выдаст на экран содержимое первых двух байт внутреннего представления вещественного числа п = 3.1415 в виде целого числа:

var

х : Real; у : array[1..3] of Integer absolute x;

begin

х := pi; WriteLn(y[1])

end.

На экран будет выдан результат 8578.

Неявные преобразования типов могут служить источником трудно обнаруживаемых ошибок в программе, поэтому везде, где это возможно, следует избегать их.