i128
128-bit signed integer: -170,141,183,460,469,231,731,687,303,715,884,105,728 to 170,141,183,460,469,231,731,687,303,715,884,105,727.
These examples describe the Development language contract. They are not a claim that every workflow is supported by the current public preview. Declaration excerpts belong inside a function unless a full module is shown.
Range and representation
i128 is a fixed-width signed two’s-complement integer. Its width does not depend on pointer size.
| Property | Value |
|---|---|
| Storage | 128 bits / 16 bytes |
| Minimum | -170,141,183,460,469,231,731,687,303,715,884,105,728 |
| Maximum | 170,141,183,460,469,231,731,687,303,715,884,105,727 |
let Minimum: i128 = -170141183460469231731687303715884105728_i128;
let Maximum: i128 = 170141183460469231731687303715884105727_i128;Literals and inference
A fitting integer literal can take i128 from context; _i128 selects it explicitly. Unconstrained integer literals default to i32; an explicit suffix removes that ambiguity. Decimal, binary, octal and hexadecimal integer spellings are available. An out-of-range literal is a compile-time error; even an unsigned literal does not silently wrap.
let Count: i128 = 42;
let Explicit = 42_i128;
let Bits: i128 = 0x2A;
// Rejected: let Outside: i128 = 170141183460469231731687303715884105728;Arithmetic, bits and failure
Ordinary addition, subtraction and multiplication fatal-trap on overflow. Negating the minimum value also fatal-traps. Division truncates toward zero; remainder has the dividend’s sign or is zero. Minimum / -1 and minimum % -1 fatal-trap. Division or remainder by zero fatal-traps. .CheckedAdd, .CheckedSub and .CheckedMul return an optional result. +%, -%, *% select wrapping; +|, -|, *| select saturation. Bitwise operations and shifts are supported. Ordinary shift counts must be 0 through 127; right shift sign-fills.
let Maximum: i128 = 170141183460469231731687303715884105727_i128;
let Missing: i128? = Maximum.CheckedAdd(1); // none
let Clamped: i128 = Maximum +| 1; // Maximum
let Wrapped: i128 = Maximum +% 1; // -170141183460469231731687303715884105728
let Bits: i128 = 1_i128 << 2; // 4Conversions and mixed expressions
Implicit widening stays within the signed family. There is no implicit signed/unsigned or integer/float conversion. Explicit as checks the destination range and fatal-traps on failure; as? returns none instead. Narrowing never silently truncates. Binary operations use a common reachable same-family type; compound assignment keeps its left type.
let Value: i128 = 42;
let Fits: i64? = Value as? i64;
let TooLarge: i128 = 170141183460469231731687303715884105727_i128;
let Missing: i64? = TooLarge as? i64; // noneSee all primitive types and literals and user-defined suffixes.