64-bit signed integers with checked arithmetic.
Common 64-bit integer functions.
Most operations are available as built-in operators (e.g. 1 + 1
).
type Int64 = Prim.Types.Int64
64-bit signed integers.
let minimumValue : Int64
Minimum 64-bit integer value, -2 ** 63
.
let maximumValue : Int64
Maximum 64-bit integer value, +2 ** 63 - 1
.
let toInt : Int64 -> Int
Converts a 64-bit signed integer to a signed integer with infinite precision.
Example:
import Int64 "mo:base/Int64";
Int64.toInt(123_456) // => 123_456 : Int
let fromInt : Int -> Int64
Converts a signed integer with infinite precision to a 64-bit signed integer.
Traps on overflow/underflow.
Example:
import Int64 "mo:base/Int64";
Int64.fromInt(123_456) // => +123_456 : Int64
let fromIntWrap : Int -> Int64
Converts a signed integer with infinite precision to a 64-bit signed integer.
Wraps on overflow/underflow.
Example:
import Int64 "mo:base/Int64";
Int64.fromIntWrap(-123_456) // => -123_456 : Int64
let fromNat64 : Nat64 -> Int64
Converts an unsigned 64-bit integer to a signed 64-bit integer.
Wraps on overflow/underflow.
Example:
import Int64 "mo:base/Int64";
Int64.fromNat64(123_456) // => +123_456 : Int64
let toNat64 : Int64 -> Nat64
Converts a signed 64-bit integer to an unsigned 64-bit integer.
Wraps on overflow/underflow.
Example:
import Int64 "mo:base/Int64";
Int64.toNat64(-1) // => 18_446_744_073_709_551_615 : Nat64 // underflow
func toText(x : Int64) : Text
Returns the Text representation of x
.
Formats the integer in decimal representation without underscore separators for thousand figures.
Example:
import Int64 "mo:base/Int64";
Int64.toText(-123456) // => "-123456"
func abs(x : Int64) : Int64
Returns the absolute value of x
.
Traps when x == -2 ** 63
(the minimum Int64
value).
Example:
import Int64 "mo:base/Int64";
Int64.abs(-123456) // => +123_456
func min(x : Int64, y : Int64) : Int64
Returns the minimum of x
and y
.
Example:
import Int64 "mo:base/Int64";
Int64.min(+2, -3) // => -3
func max(x : Int64, y : Int64) : Int64
Returns the maximum of x
and y
.
Example:
import Int64 "mo:base/Int64";
Int64.max(+2, -3) // => +2
func equal(x : Int64, y : Int64) : Bool
Returns x == y
.
Example:
import Int64 "mo:base/Int64";
Int64.equal(123, 123) // => true
func notEqual(x : Int64, y : Int64) : Bool
Returns x != y
.
Example:
import Int64 "mo:base/Int64";
Int64.notEqual(123, 123) // => false
func less(x : Int64, y : Int64) : Bool
Returns x < y
.
Example:
import Int64 "mo:base/Int64";
Int64.less(123, 1234) // => true
func lessOrEqual(x : Int64, y : Int64) : Bool
Returns x <= y
.
Example:
import Int64 "mo:base/Int64";
Int64.lessOrEqual(123, 1234) // => true
func greater(x : Int64, y : Int64) : Bool
Returns x > y
.
Example:
import Int64 "mo:base/Int64";
Int64.greater(1234, 123) // => true
func greaterOrEqual(x : Int64, y : Int64) : Bool
Returns x >= y
.
Example:
import Int64 "mo:base/Int64";
Int64.greaterOrEqual(1234, 123) // => true
func compare(x : Int64, y : Int64) : {#less; #equal; #greater}
Returns the order of x
and y
.
Example:
import Int64 "mo:base/Int64";
Int64.compare(123, 1234) // => #less
func neg(x : Int64) : Int64
Returns the negation of x
, -x
.
Traps on overflow, i.e. for neg(-2 ** 63)
.
Example:
import Int64 "mo:base/Int64";
Int64.neg(123) // => -123
func add(x : Int64, y : Int64) : Int64
Returns the sum of x
and y
, x + y
.
Traps on overflow/underflow.
Example:
import Int64 "mo:base/Int64";
Int64.add(1234, 123) // => +1_357
func sub(x : Int64, y : Int64) : Int64
Returns the difference of x
and y
, x - y
.
Traps on overflow/underflow.
Example:
import Int64 "mo:base/Int64";
Int64.sub(1234, 123) // => +1_111
func mul(x : Int64, y : Int64) : Int64
Returns the product of x
and y
, x * y
.
Traps on overflow/underflow.
Example:
import Int64 "mo:base/Int64";
Int64.mul(123, 100) // => +12_300
func div(x : Int64, y : Int64) : Int64
Returns the signed integer division of x
by y
, x / y
.
Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.
Traps when y
is zero.
Example:
import Int64 "mo:base/Int64";
Int64.div(123, 10) // => +12
func rem(x : Int64, y : Int64) : Int64
Returns the remainder of the signed integer division of x
by y
, x % y
,
which is defined as x - x / y * y
.
Traps when y
is zero.
Example:
import Int64 "mo:base/Int64";
Int64.rem(123, 10) // => +3
func pow(x : Int64, y : Int64) : Int64
Returns x
to the power of y
, x ** y
.
Traps on overflow/underflow and when y < 0 or y >= 64
.
Example:
import Int64 "mo:base/Int64";
Int64.pow(2, 10) // => +1_024
func bitnot(x : Int64) : Int64
Returns the bitwise negation of x
, ^x
.
Example:
import Int64 "mo:base/Int64";
Int64.bitnot(-256 /* 0xffff_ffff_ffff_ff00 */) // => +255 // 0xff
func bitand(x : Int64, y : Int64) : Int64
Returns the bitwise "and" of x
and y
, x & y
.
Example:
import Int64 "mo:base/Int64";
Int64.bitand(0xffff, 0x00f0) // => +240 // 0xf0
func bitor(x : Int64, y : Int64) : Int64
Returns the bitwise "or" of x
and y
, x | y
.
Example:
import Int64 "mo:base/Int64";
Int64.bitor(0xffff, 0x00f0) // => +65_535 // 0xffff
func bitxor(x : Int64, y : Int64) : Int64
Returns the bitwise "exclusive or" of x
and y
, x ^ y
.
Example:
import Int64 "mo:base/Int64";
Int64.bitxor(0xffff, 0x00f0) // => +65_295 // 0xff0f
func bitshiftLeft(x : Int64, y : Int64) : Int64
Returns the bitwise left shift of x
by y
, x << y
.
The right bits of the shift filled with zeros.
Left-overflowing bits, including the sign bit, are discarded.
For y >= 64
, the semantics is the same as for bitshiftLeft(x, y % 64)
.
For y < 0
, the semantics is the same as for bitshiftLeft(x, y + y % 64)
.
Example:
import Int64 "mo:base/Int64";
Int64.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.
func bitshiftRight(x : Int64, y : Int64) : Int64
Returns the signed bitwise right shift of x
by y
, x >> y
.
The sign bit is retained and the left side is filled with the sign bit.
Right-underflowing bits are discarded, i.e. not rotated to the left side.
For y >= 64
, the semantics is the same as for bitshiftRight(x, y % 64)
.
For y < 0
, the semantics is the same as for bitshiftRight (x, y + y % 64)
.
Example:
import Int64 "mo:base/Int64";
Int64.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`
func bitrotLeft(x : Int64, y : Int64) : Int64
Returns the bitwise left rotatation of x
by y
, x <<> y
.
Each left-overflowing bit is inserted again on the right side.
The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.
Changes the direction of rotation for negative y
.
For y >= 64
, the semantics is the same as for bitrotLeft(x, y % 64)
.
Example:
import Int64 "mo:base/Int64";
Int64.bitrotLeft(0x2000_0000_0000_0001, 4) // => +18 // 0x12.
func bitrotRight(x : Int64, y : Int64) : Int64
Returns the bitwise right rotation of x
by y
, x <>> y
.
Each right-underflowing bit is inserted again on the right side.
The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.
Changes the direction of rotation for negative y
.
For y >= 64
, the semantics is the same as for bitrotRight(x, y % 64)
.
Example:
import Int64 "mo:base/Int64";
Int64.bitrotRight(0x0002_0000_0000_0001, 48) // => +65538 // 0x1_0002.
func bittest(x : Int64, p : Nat) : Bool
Returns the value of bit p
in x
, x & 2**p == 2**p
.
If p >= 64
, the semantics is the same as for bittest(x, p % 64)
.
Example:
import Int64 "mo:base/Int64";
Int64.bittest(128, 7) // => true
func bitset(x : Int64, p : Nat) : Int64
Returns the value of setting bit p
in x
to 1
.
If p >= 64
, the semantics is the same as for bitset(x, p % 64)
.
Example:
import Int64 "mo:base/Int64";
Int64.bitset(0, 7) // => +128
func bitclear(x : Int64, p : Nat) : Int64
Returns the value of clearing bit p
in x
to 0
.
If p >= 64
, the semantics is the same as for bitclear(x, p % 64)
.
Example:
import Int64 "mo:base/Int64";
Int64.bitclear(-1, 7) // => -129
func bitflip(x : Int64, p : Nat) : Int64
Returns the value of flipping bit p
in x
.
If p >= 64
, the semantics is the same as for bitclear(x, p % 64)
.
Example:
import Int64 "mo:base/Int64";
Int64.bitflip(255, 7) // => +127
let bitcountNonZero : (x : Int64) -> Int64
Returns the count of non-zero bits in x
.
Example:
import Int64 "mo:base/Int64";
Int64.bitcountNonZero(0xffff) // => +16
let bitcountLeadingZero : (x : Int64) -> Int64
Returns the count of leading zero bits in x
.
Example:
import Int64 "mo:base/Int64";
Int64.bitcountLeadingZero(0x8000_0000) // => +32
let bitcountTrailingZero : (x : Int64) -> Int64
Returns the count of trailing zero bits in x
.
Example:
import Int64 "mo:base/Int64";
Int64.bitcountTrailingZero(0x0201_0000) // => +16
func addWrap(x : Int64, y : Int64) : Int64
Returns the sum of x
and y
, x +% y
.
Wraps on overflow/underflow.
Example:
import Int64 "mo:base/Int64";
Int64.addWrap(2 ** 62, 2 ** 62) // => -9_223_372_036_854_775_808 // overflow
func subWrap(x : Int64, y : Int64) : Int64
Returns the difference of x
and y
, x -% y
.
Wraps on overflow/underflow.
Example:
import Int64 "mo:base/Int64";
Int64.subWrap(-2 ** 63, 1) // => +9_223_372_036_854_775_807 // underflow
func mulWrap(x : Int64, y : Int64) : Int64
Returns the product of x
and y
, x *% y
. Wraps on overflow.
Wraps on overflow/underflow.
Example:
import Int64 "mo:base/Int64";
Int64.mulWrap(2 ** 32, 2 ** 32) // => 0 // overflow
func powWrap(x : Int64, y : Int64) : Int64
Returns x
to the power of y
, x **% y
.
Wraps on overflow/underflow.
Traps if y < 0 or y >= 64
.
Example:
import Int64 "mo:base/Int64";
Int64.powWrap(2, 63) // => -9_223_372_036_854_775_808 // overflow