Тип данных word является

Уважаемые коллеги, мы рады предложить вам, разрабатываемый нами учебный курс по программированию ПЛК фирмы Beckhoff с применением среды автоматизации TwinCAT. Курс предназначен исключительно для самостоятельного изучения в ознакомительных целях. Перед любым применением изложенного материала в коммерческих целях просим связаться с нами. Текст из предложенных вам статей скопированный и размещенный в других источниках, должен содержать ссылку на наш сайт heaviside.ru. Вы можете связаться с нами по любым вопросам, в том числе создания для вас систем мониторинга и АСУ ТП.


Типы данных в языках стандарта МЭК 61131-3

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

Простые типы данных

В прошлой статье мы научились записывать цифры в двоичной системе счисления. Именно такую систему счисления используют все компьютеры, микропроцессоры и прочая вычислительная техника. Теперь мы будем изучать типы данных.

Любая переменная, которую вы используете в своем коде, будь то показания датчиков, состояние выхода или выхода, состояние катушки или просто любая промежуточная величина, при выполнении программы будет хранится в оперативной памяти. Чтобы под каждую используемую переменную на этапе компиляции проекта была выделена оперативная память, мы объявляем переменные при написании программы. Компиляция, это перевод исходного кода, написанного программистом, в команды на языке ассемблера понятные процессору. Причем в зависимости от вида применяемого процессора один и тот же исходный код может транслироваться в разные ассемблерные команды (вспомним что ПЛК Beckhoff, как и персональные компьютеры работают на процессорах семейства x86).

Как помните, из статьи Знакомство с языком LD, при объявлении переменной необходимо указать, к какому типу данных будет принадлежать переменная. Как вы уже можете понять, число B016 будет занимать гораздо меньший объем памяти чем число 4 C4E5 01E7 7A9016. Также одни и те же операции с разными типами данных будут транслироваться в разные ассемблерные команды. В TwinCAT используются следующие типы данных:

Классификация типов данных TwinCAT 3

Биты

BOOL — это простейший тип данных, как уже было сказано, этот тип данных может принимать только два значения ​0 и 1. Так же в TwinCAT, как и в большинстве языков программирования, эти значения, наравне с 0 и 1, обозначаются как TRUE и FALSE и несут в себе количество информации, соответствующее одному биту. Минимальным объемом данных, который читается из памяти за один раз, является байт, то есть восемь бит. Поэтому, для оптимизации скорости доступа к данным, переменная типа BOOL занимает восемь бит памяти. Для хранения самой переменной используется нулевой бит, а биты с первого по седьмой заполнены нулями. Впрочем, на практике о таком нюансе приходится вспоминать достаточно редко.

BIT — то же самое, что и BOOL, но в памяти занимает 1 бит. Как можно догадаться, операции с этим типом данных медленнее чем с типом BOOL, но он занимает меньше места в памяти. Тип данных BIT отсутствует в стандарте МЭК 61131-3 и поддерживается исключительно в TwinCAT, поэтому стоит отдавать предпочтение типу BOOL, когда у вас нет явных поводов использовать тип BIT.

Целочисленные типы данных

BYTE — тип данных, по размеру соответствующий одному байту. Хоть с типом BYTE можно производить математические операции, но в первую очередь он предназначен для хранения набора из ​8 ​бит. Иногда в таком виде удобнее, чем побитно, передавать данные по цифровым интерфейсам, работать с входами выходами и так далее. С такими вопросами мы будем знакомится далее по мере изучения курса. В переменную типа BYTE ​можно записать числа из диапазона 0..255 (0..28-1).

WORD — то же самое, что и BYTE, но размером ​16​ бит. В переменную типа WORD можно записать числа из диапазона 0..65 535​ ​(0..216-1). Тип данных WORD переводится с английского как «слово». Давным-давно термином машинное слово называли группу бит, обрабатываемых вычислительной машиной за один раз. Была уместна фраза «Программа состоит из машинных слов.». Со временем этим термином перестали пользоваться в прямом его значении, и сейчас под термином «машинное слово» обычно подразумевается группа из 16​ бит.

DWORD — то же самое, что и BYTE, но размером 32 бит. В переменную типа DWORD можно записать числа из диапазона 0..4 294 967 295​​ ​(0..232-1). DWORD — это сокращение от double word, что переводится как двойное слово. Довольно часто буква «D» перед каким-либо типом данных значит, что этот тип данных в два раза длиннее, чем исходный.

LWORD — то же самое, что и BYTE, но размером 64 ;бит. В переменную типа LWORD можно записать числа из диапазона 0..18 446 744 073 709 551 615 (0..264-1). LWORD — это сокращение от long word, что переводится как длинное слово. Приставка «L» перед типом данных, как правило, означает что такой тип имеет длину 64 бита.

SINT — знаковый тип данных, длинной 8 бит. В переменную типа SINT можно записать числа из диапазона -128..127​​ ​(-27..27-1). В отличии от всех предыдущих типов данных этот тип данных предназначен для хранения именно чисел, а не набора бит. Слово знаковый в описании типа означает, что такой тип данных может хранить как положительные, так и отрицательные значения. Для хранения знака числа предназначен старший, в данном случае седьмой, разряд числа. Если старший разряд имеет значение 0, то число интерпретируется как положительное, если 1, то число интерпретируется как отрицательное. Приставка «S» означает short, что переводится с английского как короткий. Как вы догадались, SINT короткий вариант типа INT.

USINT — беззнаковый тип данных, длинной 8 бит. В переменную типа USINT можно записать числа из диапазона 0..255​​ ​(0..28-1). Приставка «U» означает unsigned, переводится как беззнаковый.

Остальные целочисленные типы аналогичны уже описанным и отличаются только размером. Сведем все целочисленные типы в таблицу.

Тип данных Нижний предел Верхний предел Занимаемая память
BYTE 0 255 8 бит
WORD 0 65 535 16 бит
DWORD 0 4 294 967 295 32 бит
LWORD 0 264-1 64 бит
SINT -128 127 8 бит
USINT 0 255 8 бит
INT -32 768 32 767 16 бит
UINT 0 65 535 16 бит
DINT -2 147 483 648 2 147 483 647 32 бит
UDINT 0 4 294 967 295 32 бит
LINT -263 -263-1 64 бит
ULINT 0 -264-1 64 бит

Выше мы рассматривали целочисленные типы данных, то есть такие типы данных, в которых отсутствует запятая. При совершении математических операций с целочисленными типами данных есть некоторые особенности:

  • Округление при делении: округление всегда выполняется вниз. То есть дробная часть просто отбрасывается. Если делимое меньше делителя, то частное всегда будет равно нулю, например, 10/11 = 0.
  • Переполнение: если к целочисленной переменной, например, SINT, имеющей значение 255, прибавить 1, переменная переполнится и примет значение 0. Если прибавить 2, переменная примет значение 1 и так далее. При операции 0 — 1 результатом будет 255. Это свойство очень схоже с устройством стрелочных часов. Если сейчас 2 часа, то 5 часов назад было 9 часов. Только шкала часов имеет пределы не 1..12, а 0..255. Иногда такое свойство может использоваться при написании программ, но как правило не стоит допускать переполнения переменных.

Подробно такие нюансы разбираются в пособиях по дискретной математике. Мы на них пока что останавливаться не будем, но о приведенных двух особенностях не стоит забывать при написании программ.

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

Типы данных с плавающей запятой

REAL — тип данных с плавающей запятой длинной 32 бита. В переменную типа REAL можно записать числа из диапазона -3.402 82*1038..3.402 82*1038​​.

LREAL — тип данных с плавающей запятой длинной 64 бита. В переменную типа LREAL можно записать числа из диапазона -1.797 693 134 862 315 8*10308..1.797 693 134 862 315 8*10308​​.

При присваивании значения типам REAL и LREAL присваиваемое значение должно содержать целую часть, разделительную точку и дробную часть, например, 7.4 или 560.0.

Так же при записи значения типа REAL и LREAL использовать экспоненциальную (научную) форму. Примером экспоненциальной формы записи будет Me+P, в этом примере

  • M называется мантиссой.
  • e называется экспонентой (от англ. «exponent»), означающая «·10^» («…умножить на десять в степени…»),
  • P называется порядком.

Примерами такой формы записи будет:

  • 1.64e+3 расшифровывается как 1.64e+3 = 1.64*103 = 1640.
  • 9.764e+5 расшифровывается как 9.764e+5 = 9.764*105 = 976400.
  • 0.3694e+2 расшифровывается как 0.3694e+2 = 0.3694*102 = 36.94.

Еще один способ записи присваиваемого значения переменной типа REAL и LREAL, это добавить к числу префикс REAL#, например, REAL#7.4 или REAL#560. В таком случае можно не указывать дробную часть.

Старший, 31-й бит переменной типа REAL представляет собой знак. Следующие восемь бит, с 30-го по 23-й отведены под экспоненту. Оставшиеся 23 бита, с 22-го по 0-й используются для записи мантиссы.

В переменной типа LREAL старший, 63-й бит также используется для записи знака. В следующие 11 бит, с 62 по 52-й, записана экспонента. Оставшиеся 52 бита, с 51-го по 0-й, используются для записи мантиссы.

При записи числа с большим количеством значащих цифр в переменные типа REAL и LREAL производится округление. Необходимо не забывать об этом в расчетах, к которым предъявляются строгие требования по точности. Еще одна особенность, вытекающая из прошлой, если вы хотите сравнить два числа типа REAL или LREAL, прямое сравнение мало применимо, так как если в результате округления числа отличаются хоть на малую долю результат сравнения будет FALSE. Чтобы выполнить сравнение более корректно, можно вычесть одно число из другого, а потом оценить больше или меньше модуль получившегося результата вычитания, чем наибольшая допустимая разность. Поведение системы при переполнении переменных с плавающей запятой не определенно стандартом МЭК 61131-3, допускать его не стоит.

Строковые типы данных

STRING — тип данных для хранения символов. Каждый символ в переменной типа STRING хранится в 1 байте, в кодировке Windows-1252, это значит, что переменные такого типа поддерживают только латинские символы. При объявлении переменной количество символов в переменной указывается в круглых или квадратных скобках. Если размер не указан, при объявлении по умолчанию он равен 80 символам. Для данных типа STRING количество содержащихся в переменной символов не ограниченно, но функции для обработки строк могут принять до 255 символов.

Объем памяти, необходимый для переменной STRING, всегда составляет 1 байт на символ +1 дополнительный байт, например, переменная объявленная как «STRING [80]» будет занимать 81 байт. Для присвоения константного значения переменной типа STRING присваемый текст необходимо заключить в одинарные кавычки.

Пример объявления строки на 35 символов:

sVar : STRING(35) := 'This is a String'; (*Пример объявления переменной типа STRING*)

WSTRING — этот тип данных схож с типом STRING, но использует по 2 байта на символ и кодировку Unicode. Это значит что переменные типа WSTRING поддерживают символы кириллицы. Для присвоения константного значения переменной типа WSTRING присваемый текст необходимо заключить в двойные кавычки.

Пример объявления переменной типа WSTRING:

wsVar : WSTRING := "This is a WString"; (*Пример объявления переменной типа WSTRING*)

Если значение, присваиваемое переменной STRING или WSTRING, содержит знак доллара ($), следующие два символа интерпретируются как шестнадцатеричный код в соответствии с кодировкой Windows-1252. Код также соответствует кодировке ASCII.

Код со знаком доллара Его значение в переменной
$<восьмибитное число> Восьмибитное число интерпретируется как символ в кодировке ISO / IEC 8859-1
‘$41’ A
‘$9A’ ©
‘$40’ @
‘$0D’, ‘$R’, ‘$r’ Разрыв строки
‘$0A’, ‘$L’, ‘$l’, ‘$N’, ‘$n’ Новая строка
‘$P’, ‘$p’ Конец страницы
‘$T’, ‘$t’ Табуляция
‘$$’ Знак доллара
‘$’ ‘ Одиночная кавычка

Такое разнообразие кодировок связанно с тем, что у всех из них первые 128 символов соответствуют кодовой таблице ASCII, но в статье для каждого случая кодировка указывалась так же, как она указана в infosys.

Пример:

  1. VAR CONSTANT

  2. sConstA : STRING :='Hello world';

  3. sConstB : STRING :='Hello world $21'; (*Пример объявления переменной типа STRING с спец символом*)

  4. END_VAR

Типы данных времени

TIME — тип данных, предназначенный для хранения временных промежутков. Размер типа данных 32 бита. Этот тип данных интерпретируется в TwinCAT, как переменная типа DWORD, содержащая время в миллисекундах. Нижний допустимый предел 0 (0 мс), верхний предел 4 294 967 295 (49 дней, 17 часов, 2 минуты, 47 секунд, 295 миллисекунд). Для записи значений в переменные типа TIME используется префикс T# и суффиксы d: дни, h: часы, m: минуты, s: секунды, ms: миллисекунды, которые должны располагаться в порядке убывания.

Примеры корректного присваивания значения переменной типа TIME:

TIME1 : TIME := T#14ms;
TIME1 : TIME := T#100s12ms; // Допускается переполнение в старшем отрезке времени.
TIME1 : TIME := t#12h34m15s;

Примеры некорректного присваивания значения переменной типа TIME, при компиляции будет выдана ошибка:

TIME1 : TIME := t#5m68s;   // Переполнение не в старшем отрезке времени недопустимо
TIME1 : TIME := 15ms;   // Пропущен префикс T#
TIME1 : TIME := t#4ms13d;   // Не соблюден порядок записи временных отрезок

LTIME — тип данных аналогичен TIME, но его размер составляет 64 бита, а временные отрезки хранятся в наносекундах. Нижний допустимый предел 0, верхний предел 213 503 дней, 23 часов, 34 минуты, 33 секунд, 709 миллисекунд, 551 микросекунд и 615 наносекунд. Для записи значений в переменные типа LTIME используется префикс LTIME#. Помимо суффиксов, используемых для записи типа TIME для LTIME, используются µs: микросекунды и ns: наносекунды.

Пример:

LTIME1 : LTIME := LTIME#1000d15h23m12s34ms2us44ns; (*Пример объявления переменной типа LTIME*)

TIME_OF_DAY (TOD) — тип данных для записи времени суток. Имеет размер 32 бита. Нижнее допустимое значение 0, верхнее допустимое значение 23 часа, 59 минут, 59 секунд, 999 миллисекунд. Для записи значений в переменные типа TOD используется префикс TIME_OF_DAY# или TOD#, значение записывается в виде <часы : минуты : секунды> . В остальном этот тип данных аналогичен типу TIME.

Пример:

TIME_OF_DAY#15:36:30.123
tod#00:00:00

Date — тип данных для записи даты. Имеет размер 32 бита. Нижнее допустимое значение 0 (01.01.1970), верхнее допустимое значение 4 294 967 295  (7 февраля 2106), да, здесь присутствует возможный компьютерный апокалипсис, но учитывая запас по верхнему пределу, эта проблема не слишком актуальна. Для записи значений в переменные типа TOD используется префикс DATE# или D#, значение записывается в виде <год — месяц — дата>. В остальном этот тип данных аналогичен типу TIME.

DATE#1996-05-06
d#1972-03-29

DATE_AND_TIME (DT) — тип данных для записи даты и времени. Имеет размер 32 бита. Нижнее допустимое значение 0 (01.01.1970), верхнее допустимое значение 4 294 967 295 (7 февраля 2106, 6:28:15). Для записи значений в переменные типа DT используется префикс DATE_AND_TIME # или DT#, значение записывается в виде <год — месяц — дата — час : минута : секунда>. В остальном этот тип данных аналогичен типу TIME.

DATE_AND_TIME#1996-05-06-15:36:30
dt#1972-03-29-00:00:00

На этом раз мы заканчиваем рассмотрение типов данных. Сейчас мы разобрали не все типы данных, остальные можно найти в infosys по пути TwinCAT 3 → TE1000 XAE → PLC → Reference Programming → Data types.

Следующая статья будет целиком состоять из практической работы, мы напишем калькулятор на языке LD.








Deutsch (de)
English (en)



suomi (fi)
français (fr)










русский (ru)









A word is the processor’s native data unit.
Modern consumer processors have a word width of 64 bits.

Data type

Most run-time libraries provide the native data type of a processor as the Pascal data type word.
It is a subset of all whole numbers (non-negative integers) that can be represented by the processor’s natural data unit size.

On a 64-bit architecture this means a word is an integer within the range [math]displaystyle{ [0,~2^{64}-1] }[/math].
On a 32-bit architecture a word will be an integer in the range [math]displaystyle{ [0,~2^{32}-1] }[/math], and so on, respectively.

In GNU Pascal a word is just an alias for cardinal, which has the same properties regarding possible values.

If a signed integer having the processor’s native size is wanted, the data type integer provides this functionality.

FPC

For source compatibility reasons, FPC defines word in the same way as Turbo Pascal and Delphi: the subrange data type 0..65535.
The high value 65535 is [math]displaystyle{ 2^{16}-1 }[/math].
Thus a system.word occupies two bytes of space.
Subrange data types are stored in a quantity that serves best the goals of performance and memory efficiency.

The processor’s native word size, as defined above, corresponds to different types depending on the purpose you want to use it for:

  • the (as of 2022 still undocumented) system.ALUSint and system.ALUUint types correspond to the native word size used by the processor’s ALU (arithmetic and logical unit), as defined at the beginning of this page. In general, this type should not be used in high level code. Instead, choose a data type based on the values it should be able to represent, as this is safer and more portable. It is the compiler’s job to generate optimal code.
  • system.CodePtrUInt corresponds to the size of pointers to code, such as the address of a procedure. This can be different from a pointer to data, e. g. on targets that support multiple memory models.
  • system.PtrUInt corresponds to the size of pointers to data.

On many platforms, all of these types have the same size, but it is not the case everywhere.

In FPC a smallInt has the same size as a word, but is signed.

navigation bar: data types

simple data types

boolean
byte
cardinal
char
currency
double
dword
extended
int8
int16
int32
int64
integer
longint
real
shortint
single
smallint
pointer
qword
word

complex data types

array
class
object
record
set
string
shortstring

При описании переменной необходимо указать ее тип. Тип переменной описывает набор значений, которые она может принимать, и действия, которые могут быть над ней выполнены. Описание типа определяет идентификатор, который обозначает тип.

Простые типы делятся на стандартные (порядковые) и перечисляемые (ограниченные).

Стандартные типы

Турбо-Паскаль имеет четыре встроенных стандартных типа: integer (целое), real (вещественное), boolean (логический) и char (символьный).

Целочисленный тип (integer)

В Турбо-Паскале имеется пять встроенных целочисленных типов: shortint (короткое целое), integer (целое), longint (длинное целое), byte (длиной в байт) и word (длиной в слово). Каждый тип обозначает определенное подмножество целых чисел, как это показано в следующей Таблице.

Встроенные целочисленные типы.

Тип

Диапазон

Формат

shortint

-128 ..+127

8 битов со знаком

integer

-32768 .. 32767

16 битов со знаком

longint

-2147483648 +2147483647

32 бита со знаком

byte

0 .. 255

8 битов без знака

word

0 .. 65535

16 битов без знака

Арифметические действия над операндами целочисленного типа осуществляются в соответствии со следующими правилами:

  1. Тип целой константы представляет собой встроенный целочисленный тип с наименьшим диапазоном, включающим значение этой целой константы.
  2. В случае бинарной операции (операции, использующей два операнда), оба операнда преобразуются к их общему типу перед тем, как над ними совершается действие. Общим типом является встроенный целочисленный тип с наименьшим диапазоном, включающим все возможные значения обоих типов. Например, общим типом для целого и целого длиной в байт является целое, а общим типом для целого и целого длиной в слово является длинное целое. Действие выполняется в соответствии с точностью общего типа и типом результата является общий тип.
  3. Выражение справа в операторе присваивания вычисляется независимо от размера переменной слева.

Операции совершаемые над целыми числами:

“+” — сложение

“-“ — вычитание

“*” — умножение

SQR — возведение в квадрат

DIV — после деления отбрасывает дробную часть

MOD — получение целого остатка после деления

ABS — модуль числа

RANDOM(X)-получение случайного числа от 0 до Х

Пример:

а:=100; 
b:=60;
a DIV b результат - 1
а MOD b результат - 40

Описываются переменные целого типа следующим образом:

var список переменных: тип;

Например: var а,р,n:integer;

Вещественный тип(real)

К вещественному типу относится подмножество вещественных чисел, которые могут быть представлены в формате с плавающей запятой с фиксированным числом цифр. Запись значения в формате с плавающей запятой обычно включает три значения — m, b и e — таким образом, что m*bе, где b всегда равен 10, а m и e являются целочисленными значениями в диапазоне вещественного типа. Эти значения m и e далее определяют диапазон и точность вещественного типа.

Имеется пять видов вещественных типов: real, singlе, duble, exnende, comp. Вещественные типы различаются диапазоном и точностью связанных с ними значений

Диапазон и десятичные цифры для вещественных типов

Тип

Диапазон

Цифры

Real

Single

Duble

Extende

comp

2.9×10Е-39 до 1.7×10Е 38

1.5×10Е-45 до 3.4×10Е 38

5.0×10Е-324 до 1.7×10Е 308

3.4×10Е-493 до 1.1×10Е 403

-2Е 63 до 2Е 63

от 11 до 12

от 7 до 8

от 15 до 16

от 19 до 20

от 19 до 20

Операции совершаемые над вещественными числами:

  • Все операции допустимые для целых чисел.
  • SQRT(x)-корень квадратный из числа х.
  • SIN(X), COS(X), ARCTAN(X).
  • LN(X)-натуральный логарифм.
  • EXP(X)-экспонента Х (ех).
  • EXP(X*LN(A))-возведение в степень (Ах).
  • Функции преобразования типов:
    • TRUNC(X)-отбрасывает дробную часть;
    • ROUND(X)-округление.
  • Некоторые правила арифметических операций:
    • Если в арифметическом действии встречаются числа типа real и integer, то результат будет иметь тип real.
    • Все составные части выражения записываются в одну строку.
    • Используются только круглые скобки.
    • Нельзя подряд ставить два арифметических знака.

Описываются переменные вещественного типа следующим образом:

var список переменных: тип;

Например:

var d,g,k:real;

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

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

Каждый символ имеет свой код и номер. Порядковые номера цифр 0,1..9 упорядочены по возрастанию. Порядковые номера букв также упорядочены по возрастанию, но не обязательно следуют друг за другом.

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

> , < , >=, <=, <> .

Например: ‘A’ < ‘W’

Функции, которые применимы к символьным переменным:

  1. ORD(X) — определяет порядковый номер символа Х.

    Пример:

    ord(‘a’)=97;
  2. CHR(X) — определяет символ по номеру.

    Пример:

    chr(97)=’a’;
  3. PRED(X) — выдает символ, стоящий перед символом Х.

    Пример:

    pred(‘B’)=’A’;
  4. SUCC(X) — выдает символ, следующий после символа Х.

    Пример:

    succ(‘A’)=’B’;

Перечислимый тип

Перечислимый тип данных назван так потому, что задается в виде перечисления констант в строго определенном порядке и в строго определенном количестве. Перечислимый тип состоит из списка констант. Переменные этого типа могут принимать значение любой из этих констант. Описание перечислимого типа имеет вид:

Type <имя типа>=(список констант);
Var <имя переменной>:<имя типа>;
 

где <список констант> — это особый вид констант, задаваемых через запятую и имеющих свой порядковый номер, начиная с 0.

Например:

type
направление=(север, юг, запад, восток);
месяц=(июнь,июль,август,январь);
емкость=(ведро,бочка,канистра,бак);
var
поворот:направление;
отъезд:месяц;
объем:емкость;
 

или так:

var
поворот:(свер, юг, запад, восток);
отъезд:(июнь, июль, август, январь);
объем:(ведро, бочка, канистра, бак);
 

Можно выполнить такие операторы присваивания:

поворот:=юг;
отъезд:=август;
объем:=бак;

но нельзя выполнять смешанные присваивания:

отъезд:=юг;
объем:=август;
 

К переменным перечислимого типа применимы следующие функции:

1. ORD — порядковый номер

2. PRED — предшествующий элемент

3. SUCC — последующий элемент.

Пример:

PRED(бочка)=ведро; 
SUCC(юг)=запад; 
ORD(июль)=1;
 

Переменные перечислимого типа можно сравнить, так как они упорядочены и пронумерованы. Так выражения: север < юг, июнь < январь имеют значения TRUE, а юг>запад и бак<бочка значение FАLSE.

Ограниченный тип

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

Описывается так:

TYPE <имя типа>=константа1..константа2

При этом должны выполняться следующие правила:

  1. Обе ограниченные константы должны быть одного типа.
  2. В качестве базового типа можно использовать любой простой тип, кроме действительного(real).
  3. Начальные значение при определении ограниченного типа не должно быть больше конечного значения.

Пример:

type index=0..63;
letter=’a’..’z’; var char1,char2:letter;
a,g:index;

Можно описывать сразу в разделе описания переменных:

var a,g:0..63;
char1,char2:’a’..’z’.

Целые числа


Данные каким-либо образом необходимо представлять в памяти компьютера. Существует множество различных типов данных, простых и довольно сложных, имеющих большое число компонентов и свойств. Однако, для компьютера необходимо использовать некий унифицированный способ представления данных, некоторые элементарные составляющие, с помощью которых можно представить данные абсолютно любых типов. Этими составляющими являются числа, а вернее, цифры, из которых они состоят. С помощью цифр можно закодировать практически любую дискретную информацию. Поэтому такая информация часто называется цифровой (в отличие от аналоговой, непрерывной).

Первым делом необходимо выбрать систему счисления, наиболее подходящую для применения в конкретных устройствах. Для электронных устройств самой простой реализацией является двоичная система: есть ток — нет тока, или малый уровень тока — большой уровень тока. Хотя наиболее эффективной являлась бы троичная система. Наверное, выбор двоичной системы связан еще и с использование перфокарт, в которых она проявляется в виде наличия или отсутствия отверстия. Отсюда в качестве цифр для представления информации используются 0 и 1.

Таким образом данные в компьютере представляются в виде потока нулей и единиц. Один разряд этого потока называется битом. Однако в таком виде неудобно оперировать с данными вручную. Стандартом стало разделение всего потока на равные последовательные группы из 8 битов — байты или октеты. Далее несколько байтов могут составлять слово. Здесь следует разделять машинное слово и слово как тип данных. В первом случае его разрядность обычно равна разрядности процессора, т.к. машинное слово является наиболее эффективным элементом для его работы. В случае, когда слово трактуется как тип данных (word), его разрядность всегда равна 16 битам (два последовательных байта). Также как типы данных существую двойные слова (double word, dword, 32 бита), четверные слова (quad word, qword, 64 бита) и т.п.

Теперь мы вплотную подошли к представлению целых чисел в памяти. Т.к. у нас есть байты и различные слова, то можно создать целочисленные типы данных, которые будут соответствовать этим элементарным элементам: byte (8 бит), word (16 бит), dword (32 бита), qword (64 бита) и т.д. При этом любое число этих типов имеет обычное двоичное представление, дополненное нулями до соответствующей размерности. Можно заметить, что число меньшей размерности можно легко представить в виде числа большей размерности, дополнив его нулями, однако в обратном случае это не верно. Поэтому для представления числа большей размерности необходимо использовать несколько чисел меньшей размерности. Например:

  • qword (64 бита) можно представить в виде 2 dword (32 бита) или 4 word (16 бит) или 8 byte (8 бит);
  • dword (32 бита) можно представить в виде 2 word (16 бит) или 4 byte (8 бит);
  • word (16 бит) можно представить в виде 2 byte (8 бит);

Если A — число, B1..Bk — части числа, N — разрядность числа, M — разрядность части, N = k*M, то:

Например:

  • A = F1E2D3C4B5A69788 (qword)
  • A = 232 * F1E2D3C4 (dword) + 20 * B5A69788 (dword)
  • A = 248 * F1E2 (word) + 232 * D3C4 (word) + 216 * B5A6 (word) + 20 * 9788 (word)
  • A = 256 * F1 (byte) + 248 * E2 (byte) + … + 28 * 97 (byte) + 20 * 88 (byte)

Существуют понятия младшая часть (low) и старшая часть (hi) числа. Старшая часть входит в число с коэффициентом 2N-M, а младшая с коэффициентом 20. Например:

Байты числа можно хранить в памяти в различном порядке. В настоящее время используются два способа расположения: в прямом порядке байт и в обратном порядке байт. В первом случае старший байт записывается в начале, затем последовательно записываются остальные байты, вплоть до младшего. Такой способ используется в процессорах Motorola и SPARC. Во втором случае, наоборот, сначала записывает младший байт, а затем последовательно остальные байты, вплоть до старшего. Такой способ используется в процессорах архитектуры x86 и x64. Далее приведен пример:

Используя подобные целочисленные типы можно представить большое количество неотрицательных чисел: от 0 до 2N-1, где N — разрядность типа. Однако, целочисленный тип подразумевает представление также и отрицательных чисел. Можно ввести отдельные типы для отрицательных чисел от -2N до -1, но тогда такие типы потеряют универсальность хранить и неотрицательные, и отрицательные числа. Поэтому для определения знака числа можно выделить один бит из двоичного представления. По соглашению, это старший бит. Остальная часть числа называется мантиссой.

Если старший бит равен нулю, то мантисса есть обычное представление числа от 0 до 2N-1-1. Если же старший бит равен 1, то число является отрицательным и мантисса представляет собой так называемый дополнительный код числа. Поясним на примере:

Как видно из рисунка, дополнительный код равен разнице между числом 2N-1 и модулем исходного отрицательного числа (127 (1111111) = 128 (10000000) — |-1| (0000001)). Из этого вытекает, что сумма основного и дополнительного кода одного и того же числа равна 2N-1.

Из вышеописанного получается, что можно использовать только целочисленные типы со знаком для описания чисел. Однако существует множество сущностей, которые не требуют отрицательных значений, а значит, место под знак можно включить в представление неотрицательного числа, удвоив количество различных неотрицательных значений. Как результат, в современных компьютерах используются как типы со знаком или знаковые типы, так и типы без знака или беззнаковые типы.

В итоге можно составить таблицу наиболее используемых целочисленных типов данных:

Общее название Название в Pascal Название в C++ Описание Диапазон значений
unsigned byte byte unsigned char беззнаковый 8 бит 0..255
signed byte shortint char знаковый 8 бит -128..127
unsigned word word unsigned short беззнаковый 16 бит 0..65535
signed word smallint short знаковый 16 бит -32768..32767
unsigned double word cardinal unsigned int беззнаковый 32 бита 0..232-1
signed double word integer int знаковый 32 бита -231..231-1
unsigned quad word uint64 unsigned long long
unsigned __int64_t (VC++)
беззнаковый 64 бита 0..264-1
signed quad word int64 long long
__int64_t (VC++)
знаковый 64 бита -263..263-1

На занятии рассматриваются основные стандартные типы данных в Паскаль, понятие переменной и константы; объясняется, как работать с арифметическими операциями

Содержание:

  • Типы данных в Паскале
    • Целочисленные типы данных в Паскаль
    • Комментарии в Паскале
    • Вещественные типы данных в Паскаль
  • Приведение типов
  • Константы в Паскале
    • «Красивый» вывод целых и вещественных чисел
  • Арифметические операции в Паскале
    • Порядок выполнения операций
  • Стандартные арифметические процедуры и функции Pascal

Типы данных в Паскале

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

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

Рассмотрим наиболее распространенные в Pascal типы данных.

Целочисленные типы данных в Паскаль

Тип Диапазон Требуемая память (байт)
byte 0..255 1
shortint -128..127 1
integer -32768.. 32767 2
word 0..65535 2
longint -2147483648..2147483647 4

Нужно иметь в виду, что при написании программ в паскале integer (в переводе с англ. целое) является наиболее часто используемым, так как диапазон значений наиболее востребуем. Если необходим более широкий диапазон, используется longint (long integer, в переводе с англ. длинное целое). Тип byte в Паскале используется, когда нет необходимости работать с отрицательными значениями, то же самое касается и типа word (только диапазон значений здесь значительно больше).

Примеры того, как описываются (объявляются) переменные в Паскале:

Pascal PascalABC.NET
1
2
3
4
5
6
7
8
program a1;
var x,y:integer; {целочисленный тип}
    myname:string; {строковый тип}
begin
x:=1; y:=x+16;
myname:='Петр';
writeln ('имя: ',myname, ', возраст: ', y)
end.
1
2
3
4
5
6
7
8
program a1;
begin
  var x, y: integer; {целочисленный тип}
  var myname: string; {строковый тип}
  x := 1; y := x + 16;
  myname := 'Петр';
  print($'имя: {myname}, возраст: {y}')
end.
Результат: 
имя: Петр, возраст: 17

При использовании PascalABC.NET наиболее часто используются следующие целочисленные типы:

Тип Длина, байт Диапазон допустимых значений
integer 4 -2 147 483 648 .. 2 147 483 647
int64 8 -9 223 372 036 854 775 808 .. 9 223 372 036 854 775 807
BigInteger переменная неограниченный

Комментарии в Паскале

Обратите внимание на то, как используются комментарии в Паскале. В примере комментарии, т.е. служебный текст, который «не видим» для компилятора, заключаются в фигурные скобки {}. Обычно комментарии делаются программистами с целью пояснения фрагментов кода. Для однострочных комментариев можно использовать два слэша //:

{Очень простая программа
для вывода слова "Привет"}
begin
// вывод 
write('Привет');
end.

Задача 5. Население Москвы равняется а=9000000 жителей. Население Нью-Васюков равняется b=1000 жителей. Напишите программу, которая определяет разницу в числе жителей между двумя городами. Используйте переменные величины.

[Название файла: L1task5.pas]

Вещественные типы данных в Паскаль

Вещественные числа в Паскале и вообще в программировании — это название дробных чисел.

Тип Диапазон Требуемая память (байт)
real 2.9 * 10E-39 .. 1.7 * 10E38 6
single 1.5 * 10 E-45 .. 3.4 * 10E38 4
double 5 * 10E-324 .. 1.7 * 10E308 8
extended 1.9 * 10E-4951 .. 1.1 * 10E4932 10

Тип real в Паскале — наиболее часто используемый из вещественных типов.

Выше были представлены простые типы данных в Паскаль, к которым относятся:

  • Порядковые
  • Целые
  • Логические
  • Символьные
  • Перечисляемые
  • Интервальные
  • Вещественные

Для вывода значений переменных вещественного типа обычно используется форматированный вывод:

  • в формате используется либо одно число, означающее число позиций, отводимых на это число в экспоненциальной форме;
  • p:=1234.6789;
    Writeln(p:12);  {_1.2346E+004}
  • либо два числа, первое из которых обозначает общий размер поля, отведенного под это число, второе — число знаков после запятой, т.е. точность.
  • p:=1234.6789;
    Writeln(p:6:2); {1234.68}

    Наряду с простыми типами в языке еще используются структурированные типы данных и указатели, которым будут посвящены последующие уроки по Паскалю.

    Приведение типов

    В pascalABC.Net в некоторых случаях можно значения одного типа присваивать переменным другого типа.

    Значения типов данных, которые занимают меньше памяти, можно присвоить переменным типа данных с бОльшей емкостью. Так, возможны следующие приведения:

    integer → int64
    int64  → real
    integer → BigInteger

    Пример использования операции приведения типов:

    var a := 10; // integer
    var b := 123456789012345; // int64
    var c := -3bi; // BigInteger
     
    var i := int64(a); // приведение integer → int64
    var x := real(b); // приведение int64  → real
    var p := BigInteger(a); // приведение integer → BigInteger

    Обратное приведение с помощью функций

    Обратное приведение, т.е. чтобы присвоить значение большей ёмкости переменной типа данных меньшей емкости, следует использовать функции округления. Например:

    real → integer

    Пример:

    ##
    var x := Sqrt(3); // корень квадратный из 3, тип real
    var a := Trunc(x); // приведение к integer с отсечением дробной части. рез-т 1
    var b := Round(x); // приведение к integer с округлением до ближайшего целого. рез-т 2

    Константы в Паскале

    Зачастую в программе заранее известно, что переменная будет принимать какое-то конкретное значение и не менять его на протяжении выполнения всей программы. В таком случае необходимо использовать константу.

    Объявление константы в Паскале происходит до объявления переменных (до служебного слова var) и выглядит следующим образом:

    Пример описания константы в Паскале:

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    
    const x=17;
    var myname:string;
    begin
    myname:='Петр';
    writeln ('имя: ',myname, ', возраст: ', х)
    end.
    1
    2
    3
    4
    5
    
    const x = 17;
    begin
      var myname := 'Петр';
      print($'имя: {myname}, возраст: {x}')
    end.

    «Красивый» вывод целых и вещественных чисел

    Для того чтобы после вывода значений переменных оставались отступы, чтобы значения не «сливались» друг с другом, принято через двоеточие указывать какое количество символов нужно предусмотреть для вывода значения:

    Вывод целых чисел

    Вывод целых чисел

    Вывод вещественных чисел

    Вывод вещественных чисел

    Арифметические операции в Паскале

    ДЕЙСТВИЕ РЕЗУЛЬТАТ СМЫСЛ
    2 + 3 5 плюс
    4 — 1 3 минус
    2 * 3 6 умножить
    10 / 5 2 разделить
    10 ** 2 100 возведение в степень с результатом типа real
    17 div 5 3 целочисленное деление
    17 mod 5 2 остаток от целочисленного деления

    арифметические операции в паскале

    Порядок выполнения операций

    1. вычисление выражений в скобках;
    2. умножение, деление, div, mod слева направо;
    3. сложение и вычитание слева направо.

    порядок выполнения операций


    Канонический способ:

    var 
      a: integer;
      b: real;
     
    begin
      a := 1;
      writeln('a := 1; a = ',a);
      a += 2; // Увеличение на 2
      writeln('a += 2; a = ',a);
      a *= 3; // Умножение на 3
      writeln('a *= 3; a = ',a);
      writeln;
      b := 6;
      writeln('b := 6; b = ',b);
      r /= 2;
      writeln('b /= 2; b = ',b);
    end.

    Стандартные арифметические процедуры и функции Pascal

    Здесь стоит более подробно остановиться на некоторых арифметических операциях.

    • Операция inc в Паскале, произносимая как инкремент, это стандартная процедура pascal, которая обозначает увеличение на единицу.
    • Пример операции inc:

      1
      2
      3
      
      x:=1;
      inc(x); {Увеличивает x на 1, т.е. x=2}
      writeln (х)

      Более сложное использование процедуры inc:
      Inc(x,n) где x — порядкового типа, n — целого типа; процедура inc увеличивает x на n.

    • Аналогично работает процедура Dec в Паскале: Dec(x) — уменьшает x на 1 (декремент) или Dec(x,n) — уменьшает x на n.
    • Оператор abs представляет собой модуль числа. Работает следующим образом:
    • a:=-9;
      b:=abs(a); { b = 9}
    • Оператор div в паскале является часто используемым, так как целый ряд задач связан с действием деление нацело.
    • Остаток от деления или оператор mod в pascal тоже незаменим при решении ряда задач.
    • Заслуживающей внимания является стандартная функция odd Паскаля, которая определяет, является ли целое число нечетным. Т. е. возвращает true (истина) для нечетных чисел, false (ложь) для четных чисел.
    • Пример использования функции odd:

      1
      2
      3
      4
      
      begin
          WriteLn(Odd(5)); {True}
          WriteLn(Odd(4)); {False}
      end.
    • Функция exp в паскале возвращает экспоненту параметра. Записывается как exp(x), где x типа real.
    • Квадрат числа в Паскале вычисляется при помощи процедуры sqr.
    • Пример использования процедуры sqr в Pascal:

      1
      2
      3
      4
      5
      
      var x:integer;
      begin
      x:=3;
      writeln(sqr(x)); {ответ 9}
      end.
    • Операция возведение в степень в Паскале отсутствует как таковая. Но для того чтобы возвести в степень число можно использовать функцию exp.
    • Формула такая: exp(ln(a)*n), где а — число, n — степень (а>0).

      Однако в компиляторе pascal abc возведение в степень осуществляется значительно проще:

       WriteLn(Power(2,3)); {ответ 8}
    • Извлечь квадратный корень в Паскале можно при помощи процедуры sqrt.
    • Пример использования процедуры sqrt в Pascal:

      1
      2
      3
      4
      5
      
      var x:integer;
      begin
      x:=9;
      writeln(sqrt(x)); {ответ 3}
      end.

    Задача 6. Известны размеры спичечной коробки: высота — 12.41 см., ширина — 8 см., толщина — 5 см. Вычислить площадь основания коробки и ее объем

    (S=ширина * толщина, V=площадь*высота)

    [Название файла: L1task6.pas]

    Задача 7. В зоопарке три слона и довольно много кроликов, причем количество кроликов часто меняется. Слону положено съедать в сутки сто морковок, а кролику — две. Каждое утро служитель зоопарка сообщает компьютеру количество кроликов. Компьютер в ответ на это должен сообщить служителю общее количество морковок, которые сегодня нужно скормить кроликам и слонам.

    [Название файла: L1task7.pas]

    Задача 8. Известно, что x кг конфет стоит a рублей. Определите, сколько стоит y кг этих конфет, а также, сколько килограмм конфет можно купить на k рублей. Все значения вводит пользователь.

    [Название файла: L1task8.pas]

      

    В приведенных ниже примерах все функции имеют аргументы. Аргументы
    m и n имеют целочисленный тип,
    a и b – тип real,
    x и y – любой из этих типов.

    Abs(x) – возвращает абсолютное значение аргумента x;
    Ceil(x) - возвращает ближайшее целое, не меньшее, чем х;
    Floor(x) - возвращает ближайшее целое, не превышающее х;
    Frac(x) - возвращает дробную часть аргумента x;
    Max(x, y, …) – возвращает максимальное из значений x, y, …;
    Min(x, y, …) – возвращает минимальное из значений x, y, … ;
    Random(m) – возвращает случайное число из интервала [0 ; m-1];
    Random(a) – возвращает случайное число из интервала [0 ; a);
    Random(m, n) – возвращает случайное число из интервала [m ; n];
    Random(a, b) – возвращает случайное число из интервала [a ; b);
    Random2(m) – возвращает кортеж из двух случайных чисел в интервале [0 ; m-1];
    Random2(a) – возвращает кортеж из двух случайных чисел в интервале [0 ; a);
    Random2(m, n) – возвращает кортеж из двух случайных чисел в интервале [m ; n];
    Random2(a, b) – возвращает кортеж из двух случайных чисел в интервале [a ; b);
    Random3(m) – возвращает кортеж из трех случайных чисел в интервале [0 ; m-1];
    Random3(a, b) – возвращает кортеж из трех случайных чисел в интервале [a ; b);
    Round(x) - возвращает округленное до целых по правилам арифметики значение типа integer;
    Round(x, n) - возвращает значение х, округленное до n знаков в дробной части;
    Sign(x) – возвращает -1 при x < 0, 0 при x = 0 и 1 при x > 0;
    Sin(x) – возвращает sin(x) типа real;
    Sqr(a) – возвращает a2;
    Sqr(m) – возвращает m2 типа int64;
    Sqrt(x) – возвращает √x типа real;
    Trunc(a) – возвращает целую часть значения a того же типа
    

    stesl писал(а): ↑23 мар 2021, 10:37
    Тип Word — это целочисленный беззнаковый тип данных, в два байта. Диапазон 0-65535. Используется везде, где оказывается нужным.

    Не путайте Word с UInt (unsigned integer16), он не относится к целочисленным, так как не кодирует числовые значения и не совместим с математическими операциями.
    Потому что:

    Sergy6661 писал(а): ↑23 мар 2021, 12:54
    Вот для упаковки-распаковки битовых переменных и используется в основном.

    Но не в основном, а только для этого. Если конечно в конкретном ПЛК не срабатывает неявное преобразование, из-за которого кажется, что Word — это целое число.

    Отправлено спустя 21 минуту 7 секунд:
    Не, иначе объясню:
    Word — это когда ты в 16 бит записал 16 булевых значений, каждый из которых что-то значит в смысле true/false. Например, при управлении сервоприводом или частотником.
    Int16, UInt16 — это числа, отдельные биты не представляют интереса (хотя бывают редкие исключения).
    Математические операции умеют работать с числами, то есть Add(), Sub(), Mul(), Div() работают с Int16/UInt16, а с Word работает подозрительно, подсвечивает типа «глянь, что за дрянь ты задумал?», но воспринимает как число 0-65535. Извините, правда, зачем вы складываете слово управления частотника с числом -85?
    Зато сдвиговые операции и операции со словами типа ANDW(), ORW(), NOT(W), XORW() работают именно со словами и подозрительно с целыми числами.

    Это разные типы данных, хотя все они 16 бит.

    Понравилась статья? Поделить с друзьями:
  • Тип данных word что это
  • Тип данных word размер
  • Тип данных word диапазон
  • Тип данных word windows
  • Тип данных word modbus