The values in an ordinal type have a one-to-one correspondence with the set of positive integers. The values are ordered so that each has a unique ordinal value indicating its position in a list of values of that type.
1 – INTEGER Types
VSI Pascal provides the INTEGER, INTEGER64 (not available on all systems) integer types. Also provided are the INTEGER8, INTEGER16, and INTEGER32 types, which are used as synonyms for subranges of the INTEGER type. The range of integer values consists of positive and negative integer values and of the value 0. The range boundaries depend on the architecture of the machine you are using. The largest possible value of the INTEGER type is represented by the predeclared constant MAXINT. The largest possible value of the INTEGER64 type is represented by the predeclared constant MAXINT64.
1.1 – Standard Int Radix
Extended digit notation allows you to express integer values in terms of a base number. VSI Pascal accepts numbers in bases 2 through 36. Syntax: [[ + | - ]] base-number#[[']]extended-digit[[']] The 'base-number' specifies the base of the number. The 'extended-digit' specifies the notation that is appropriate for the specified base. You can use extended-digit notation in the same way you use the conventional integer notation, with the following exceptions: o Extended-digit values cannot be used as labels. o Extended-digit notation for INTEGER objects cannot be used to express numbers outside the range of 0 to MAXINT. (To express signed numbers, place the unary plus operator (+) or the unary minus operator (-) in front of the notation; setting or clearing the high order bit does not set or clear the sign bit.) VSI Pascal allows the use of spaces and tabs to make the extended-digit notation easier to read. To use spaces and tabs, enclose the extended digit in single quotation marks (' '). The following are integer values in the extended-digit notation: 2#10000011 2#'1000 0011' 32#1J -16#'7FFF FFFF'
1.2 – Nonstandard Int Radix
VSI Pascal provides another extended integer convention for compatibility with previous versions of the language. This notation specifies an integer in either binary (base 2), octal (base 8), or hexadecimal (base 16) notation. Syntax: b [[ + | - ]] % o [[']]extended-digit[[']] x The 'b', 'o', or 'x' specifies binary, octal, or hexidecimal notation, respectively. The 'extended-digit' specifies the notation that is appropriate for the specified base. The following are extended integer values in the VSI Pascal specific notation: %b'1000 0011' %O'7712' -%x'DEC'
2 – INTEGER_ADDRESS
The INTEGER_ADDRESS predefined type is an integer that has the same underlying bit size as a pointer. On OpenVMS systems, INTEGER_ADDRESS is equivalent to INTEGER32.
3 – INTEGER8
The INTEGER8 predefined type is equivalent to the following: Syntax: TYPE INTEGER8=[BYTE]-128..127;{ 16#80..16#7F}
4 – INTEGER16
The INTEGER16 predefined type is equivalent to the following: Syntax: TYPE INTEGER16=[WORD]-32768..32767;{ 16#8000..16#7FFF }
5 – INTEGER32
The INTEGER32 predefined type is equivalent to the following: Syntax: TYPE INTEGER32=[LONG]-2147483648..2147483647;{ 16#80000000..16#7FFFFFFF }
6 – INTEGER64
The INTEGER64 predefined type is equivalent to the following: Syntax: INTEGER64=[QUAD]-9223372036854775808..9223372036854775807; { 16#8000000000000000..16#7FFFFFFFFFFFFFFF } The INTEGER64 predefined type is not available on OpenVMS VAX systems.
7 – UNSIGNED Types
VSI Pascal provides the UNSIGNED and UNSIGNED64 types (not available on all systems). Also provided are the UNSIGNED8, UNSIGNED16, UNSIGNED32, CARDINAL, CARDINAL16, and CARDINAL32 types, which are used as synonyms for the UNSIGNED type. The range of unsigned values consists of nonnegative integer values. The largest possible value of the UNSIGNED data type is represented by the predefined constant MAXUNSIGNED. The largest value for the UNSIGNED64 data type is represented by the predefined constant MAXUNSIGNED64. The smallest possible value for the UNSIGNED data type is 0.
8 – Standard Uns Radix
Extended digit notation allows you to express unsigned integer values in terms of a base number. VSI Pascal accepts numbers in bases 2 through 36. Syntax: [[ + | - ]] base-number#[[']]extended-digit[[']] The 'base-number' specifies the base of the number. The 'extended-digit' specifies the notation that is appropriate for the specified base. You can use extended-digit notation in the same way you use the conventional unsigned integer notation, except that extended-digit values cannot be used as labels. VSI Pascal allows the use of spaces and tabs to make the extended-digit notation easier to read. To use spaces and tabs, enclose the extended digit in single quotation marks (' '). The following are unsigned integer values in the extended-digit notation: 16#80000000 16#'8000 0000' 16#'FFFF FFFF'
8.1 – Nonstandard Uns Radix
VSI Pascal provides another extended integer convention only for the sake of compatibility with previous versions of the language. This notation specifies an unsigned integer in either binary (base 2), octal (base 8), or hexadecimal (base 16) notation. Syntax: b [[ + | - ]] % o [[']]extended-digit[[']] x The 'b', 'o', or 'x' specifies binary, octal, or hexidecimal notation, respectively. The 'extended-digit' specifies the notation that is appropriate for the specified base. The following are unsigned integer values in the VSI Pascal specific notation: %x'8000 0000' %x'FFFF FFFF'
9 – UNSIGNED8
The UNSIGNED8 data type is equivalent to the following: Syntax: TYPE UNSIGNED8 = [BYTE]UINT(0)..UINT(255); {0..16#FF}
10 – UNSIGNED16
The UNSIGNED16 data type is equivalent to the following: Syntax: TYPE UNSIGNED16 = [WORD]UINT(0)..UINT(65535); {0..16#FFFF}
11 – UNSIGNED32
The UNSIGNED32 data type is equivalent to the following: Syntax: TYPE UNSIGNED32 = [LONG]UINT(0)..UINT(4294967295); {0..16#FFFFFFFF}
12 – UNSIGNED64
The UNSIGNED64 data type is equivalent to the following (OpenVMS Alpha and OpenVMS I64 systems only): Syntax: TYPE UNSIGNED64 = [QUAD]UINT(0)..UINT(18446744073709551615); {0..16#FFFFFFFFFFFFFFFF}
13 – CHAR
The CHAR data type consists of single character values from the ASCII character set. The largest possible value of the CHAR data type is the predefined constant MAXCHAR. To specify a character constant, enclose a printable ASCII character in single quotation marks. To specify the single-quote character, enclose two single quotation marks in single quotation marks. Each of the following is a valid character constant: 'A' '0' {This is character 0, not the integer value 0} '''' {The apostrophe character} '?' You can specify nonprinting characters, such as a control-character, by writing an empty string followed immediately by the ordinal value of the character in the ASCII character set, or by using the CHR function followed by the ordinal value of the character in the ASCII character set. For example, both of the following specify the bell control character: ''(7) CHR(7)
14 – Boolean
Boolean values are the result of testing relationships for truth or validity. The Boolean data type consists of the two predeclared identifiers FALSE and TRUE. The expression ORD(FALSE) results in the value 0; ORD(TRUE) returns the integer 1.
15 – Enumerated
An enumerated type is a user-defined ordered set of constant values specified by identifiers. Syntax: ({enumerated-identifier},...) The 'enumerated-identifier' is an identifier of the enumerated type being defined. VSI Pascal allows a maximum of 65,535 identifiers in an enumerated type. The values of an enumerated type begin with the value 0 and follow a left-to-right order. Subsequent identifiers have a value one greater than the identifier preceding it. Example: X : ( Spring, Summer, Fall, Winter ) In this enumerated type, Spring (value 0) and Summer (value 1) are less than Fall (value 2) because they precede Fall in the list of constant values. Winter (value 3) is greater than Fall because it follows Fall. An identifier in an enumerated type cannot be defined for any other purpose in the same block.
16 – Subrange
A subrange type is user-defined and specifies a limited portion of another ordinal type (called the base type). The subrange syntax indicates the lower and upper limits of the type. Syntax: lower-bound..upper-bound The 'lower-bound' is a constant expression or a formal discriminant identifier that establishes the lower limit of the subrange. The 'upper-bound' is a constant expression or a formal discriminant identifier that establishes the upper limit of the subrange. The value of the upper bound must be greater than or equal to the value of the lower bound. The base type can be any enumerated or predefined ordinal type. The values in the subrange type appear in the same order as they are in the base type. For instance, the result of the ORD function applied to a value of a subrange type is the ordinal value that is associated with the relative position of the value in the base type, not in the subrange type. You can use a subrange type anywhere in a program that its base type is legal. A value of a subrange type is converted to a value of its base type before it is used in an operation. All rules that govern the operations performed on an ordinal type pertain to subranges of that type. Example: TYPE Day = ( Mon, Tues, Wed, Thurs, Fri, Sat, Sun ); Weekday = Mon..Fri; {subrange of base type Day} Digit = '0'..'9'; {subrange of base type CHAR} Month = 1 .. 31; {subrange of base type INTEGER} On OpenVMS Alpha and OpenVMS I64 systems, you cannot specify the size of INTEGER and UNSIGNED subranges to be larger than 32-bits eventhough such values would be legal in executable statements. For example: TYPE S = 0..8796093022208; is not supported, while VAR S : INTEGER64; BEGIN S := 8796093022208 END is legal.