## `extended integer ≝ [-∞..∞]` An integer is a discrete number, i.e., it has no fractional part. As such, integers are excellent for counting and labeling.

The literal representation of an integer is a sequence of one or more decimal digits, such as `0`, `1`, `200`, `50000`, or `598798234908600912387587829348623580980827481650893468592374832569783`. Negative integer literals are created using the method `"-_"`, which defines a semantic restriction that strengthens the answer's type to an instance type whenever the argument's value is precisely known, as is the case for `-1` or `-42`. `∞` and `-∞` are positive and negative infinity, respectively.

Avail's integral type specifies four parameters for completion:

• The lower bound is an integer which specifies the smallest allowed value. The floor operation, `"⎣_⎦"`, answers the lower bound of an integral type.
• The lower bound inclusion indicator is a `boolean` value that establishes whether the lower bound is a member of the integral type. When this value is `true`, then the lower bound is included in the type's membership. When this value is `false`, then it is not so included. The method `"⎣_⎦is inclusive"` answers the lower bound inclusion indicator of an integral type.
• The upper bound is an integer which specifies the largest allowed value. The ceiling operation, `"⎡_⎤"`, answers the upper bound of an integral type.
• The upper bound inclusion indicator is a `boolean` value that establishes whether the upper bound is a member of the integral type. When this value is `true`, then the upper bound is included in the type's membership. When this value is `false`, then it is not so included. The method `"⎡_⎤is inclusive"` answers the upper bound inclusion indicator of an integral type.

The primitive integral type constructor is `"integer range from_(inclusive=_)to_(inclusive=_)"`. As expected from the name, it accepts the lower bound, lower bound inclusion indicator, upper bound, and upper bound inclusion indicator, respectively. This method supports the most general type construction case, that of four statically unknown type completion arguments. Most type construction is done by the compiler during execution of type annotations, however, so typically most or all of the integral type completion arguments will be known at compile-time. For these cases, the system library provides the following convenience methods:

• The method `"[_.._]"` accepts two arguments, the lower and upper bounds, respectively, and constructs an integral type whose bounds are both inclusive.
Assert: 1 ∈ [1..10]; Assert: 10 ∈ [1..10];
• The method `"[_.._)"` accepts the same arguments and constructs an integral type whose lower bound is inclusive and whose upper bound is exclusive.
Assert: 1 ∈ [1..10); Assert: 10 ∉ [1..10);
• The method `"(_.._]"` accepts the same arguments and constructs an integral type whose lower bound is exclusive and whose upper bound is inclusive.
Assert: 1 ∉ (1..10]; Assert: 10 ∈ (1..10];
• The method `"(_.._)"` accepts the same arguments and constructs an integral type whose bounds are both exclusive.
Assert: 1 ∉ (1..10); Assert: 10 ∉ (1..10);

Irrespective of which integral type constructor is chosen, a canonization step converts an exclusive bound into an equivalent inclusive bound whenever possible — that is, when the bound is not infinite.

/* Both bounds are canonized. The lower bound is adjusted upward by one, and the * lower bound inclusion indicator becomes "true". Correspondingly, the upper * bound is adjusted downward by one, and the upper bound inclusion indicator * becomes "true". */ Assert: (1..10) = [2..9]; Assert: ⎣(1..10)⎦ = 2; Assert: ⎣(1..10)⎦ is inclusive; Assert: ⎡(1..10)⎤ = 9; Assert: ⎡(1..10)⎤ is inclusive; /* Only the finite lower bound is canonized. */ Assert: (1..∞) = [2..∞); Assert: (1..∞) ≠ [2..∞]; Assert: ⎣(1..∞)⎦ = 2; Assert: ⎣(1..∞)⎦ is inclusive; Assert: ⎡(1..∞)⎤ = ∞; Assert: ¬⎡(1..∞)⎤ is inclusive; /* Only the finite upper bound is canonized. */ Assert: (-∞..1) = (-∞..0]; Assert: (-∞..1) ≠ [-∞..0]; Assert: ⎣(-∞..1)⎦ = -∞; Assert: ¬⎣(-∞..1)⎦ is inclusive; Assert: ⎡(-∞..1)⎤ = 0; Assert: ⎡(-∞..1)⎤ is inclusive;

The system library provides type names for several useful integral types. `extended integer` is an alias for `[-∞..∞]`, the most general integral type; it includes all finite integers, plus negative infinity (`-∞`) and positive infinity (`∞`). `integer` is defined as `(-∞..∞)`, and is the type of all finite integers. `whole number` is `[0..∞)`, and describes all counting numbers. `natural number` is `[1..∞)`, and is the type of subscripts. `code point` is `[0..1114111]` expresses the range of valid Unicode code points. `byte` is an unsigned 8-bit integer (`[0..255]`), and is primarily useful for I/O operations. On the other end of the number line are `nonpositive integer``(-∞..0]` — and `negative integer``(-∞..-1]`.

 ‹ `float` | Return to Type System | `tuple` ›