Skip to content

Module Stdlib.Int

Integer values.

Integers are Sys.int_size bits wide and use two's complement representation. All operations are taken modulo 2Sys.int_size. They do not fail on overflow.

since 4.08

Integers

ocaml
type t = int
reasonml
type t = int;

The type for integer values.

ocaml
val zero : int
reasonml
let zero: int;

zero is the integer 0.

ocaml
val one : int
reasonml
let one: int;

one is the integer 1.

ocaml
val minus_one : int
reasonml
let minus_one: int;

minus_one is the integer -1.

ocaml
val neg : int -> int
reasonml
let neg: int => int;

neg x is ~-x.

ocaml
val add : int -> int -> int
reasonml
let add: int => int => int;

add x y is the addition x + y.

ocaml
val sub : int -> int -> int
reasonml
let sub: int => int => int;

sub x y is the subtraction x - y.

ocaml
val mul : int -> int -> int
reasonml
let mul: int => int => int;

mul x y is the multiplication x * y(x, y).

ocaml
val div : int -> int -> int
reasonml
let div: int => int => int;

Rounding division. div x y is the real quotient x / y rounded towards zero to an integer. See Stdlib.(/) for details.

raises Division_by_zero if the second argument is 0.

ocaml
val rem : int -> int -> int
reasonml
let rem: int => int => int;

rem x y is the remainder of the rounding division div x y. We have rem x y = x - div x y * y. See Stdlib.(mod) for details.

raises Division_by_zero if the second argument is 0.

ocaml
val fdiv : int -> int -> int
reasonml
let fdiv: int => int => int;

Floor division. fdiv x y is the real quotient x / y rounded down to an integer. We have fdiv x y <= div x y <= cdiv x y and cdiv x y - fdiv x y <= 1.

raises Division_by_zero if the second argument is 0. since 5.5

ocaml
val cdiv : int -> int -> int
reasonml
let cdiv: int => int => int;

Ceil division. cdiv x y is the real quotient x / y rounded up to an integer. We have fdiv x y <= div x y <= cdiv x y and cdiv x y - fdiv x y <= 1.

raises Division_by_zero if the second argument is 0. since 5.5

ocaml
val ediv : int -> int -> int
reasonml
let ediv: int => int => int;

Euclidean division. ediv x y is the real quotient x / y rounded down to an integer if y > 0 and rounded up to an integer if y < 0. The remainder erem x y = x - ediv x y * y is always non-negative. Moreover, ediv x (-y) = - ediv x y.

raises Division_by_zero if the second argument is 0. since 5.5

ocaml
val erem : int -> int -> int
reasonml
let erem: int => int => int;

Euclidean remainder. If y is not zero, we have x = ediv x y * y + erem x y and 0 <= erem x y <= abs y - 1. The result of erem x y is always non-negative, unlike the result of rem x y, which has the sign of x.

raises Division_by_zero if the second argument is 0. since 5.5

ocaml
val succ : int -> int
reasonml
let succ: int => int;

succ x is add x 1.

ocaml
val pred : int -> int
reasonml
let pred: int => int;

pred x is sub x 1.

ocaml
val abs : int -> int
reasonml
let abs: int => int;

abs x is the absolute value of x. That is x if x is positive and neg x if x is negative. Warning. This may be negative if the argument is min_int.

ocaml
val max_int : int
reasonml
let max_int: int;

max_int is the greatest representable integer, 2``Sys.int_size - 1``-1.

ocaml
val min_int : int
reasonml
let min_int: int;

min_int is the smallest representable integer, -2``Sys.int_size - 1.

ocaml
val logand : int -> int -> int
reasonml
let logand: int => int => int;

logand x y is the bitwise logical and of x and y.

ocaml
val logor : int -> int -> int
reasonml
let logor: int => int => int;

logor x y is the bitwise logical or of x and y.

ocaml
val logxor : int -> int -> int
reasonml
let logxor: int => int => int;

logxor x y is the bitwise logical exclusive or of x and y.

ocaml
val lognot : int -> int
reasonml
let lognot: int => int;

lognot x is the bitwise logical negation of x.

ocaml
val shift_left : int -> int -> int
reasonml
let shift_left: int => int => int;

shift_left x n shifts x to the left by n bits. The result is unspecified if n < 0 or n > Sys.int_size.

ocaml
val shift_right : int -> int -> int
reasonml
let shift_right: int => int => int;

shift_right x n shifts x to the right by n bits. This is an arithmetic shift: the sign bit of x is replicated and inserted in the vacated bits. The result is unspecified if n < 0 or n > Sys.int_size.

ocaml
val shift_right_logical : int -> int -> int
reasonml
let shift_right_logical: int => int => int;

shift_right_logical x n shifts x to the right by n bits. This is a logical shift: zeroes are inserted in the vacated bits regardless of the sign of x. The result is unspecified if n < 0 or n > Sys.int_size.

Predicates and comparisons

ocaml
val equal : int -> int -> bool
reasonml
let equal: int => int => bool;

equal x y is true if and only if x = y.

ocaml
val compare : int -> int -> int
reasonml
let compare: int => int => int;

compare x y is Stdlib.compare x y but more efficient.

ocaml
val min : int -> int -> int
reasonml
let min: int => int => int;

Return the smaller of the two arguments.

since 4.13

ocaml
val max : int -> int -> int
reasonml
let max: int => int => int;

Return the greater of the two arguments.

since 4.13

Bit counting

ocaml
val popcount : t -> int
reasonml
let popcount: t => int;

Population count, also known as Hamming weight. popcount n is the number of 1 bits in the binary representation of n. Negative n are represented in two's complement.

since 5.5

ocaml
val unsigned_bitsize : t -> int
reasonml
let unsigned_bitsize: t => int;

unsigned_bitsize n is the minimal number of bits needed to represent n as an unsigned binary number. It is the smallest integer i between 0 and Sys.int_size inclusive such that 0 <= n < 2{^i} (unsigned).

since 5.5

ocaml
val signed_bitsize : t -> int
reasonml
let signed_bitsize: t => int;

signed_bitsize n is the minimal number of bits needed to represent n as a signed, two's complement binary number. It is the smallest integer i between 1 and Sys.int_size inclusive such that -2{^i-1} <= n < 2{^i-1} (signed).

since 5.5

ocaml
val leading_zeros : t -> int
reasonml
let leading_zeros: t => int;

leading_zeros n is the number of leading (most significant) 0 bits in the binary representation of n. It is an integer between 0 and Sys.int_size inclusive. If n is negative, leading_zeros n = 0 since the most significant bit of n is 1. leading_zeros n = {!Sys.int_size} if and only if n = zero. Note that leading_zeros n + unsigned_bitsize n = {!Sys.int_size}.

since 5.5

ocaml
val leading_sign_bits : t -> int
reasonml
let leading_sign_bits: t => int;

leading_sign_bits n is the number of leading (most significant) sign bits in the binary representation of n, excluding the sign bit itself. It is an integer between 0 and {!Sys.int_size} - 1 inclusive. For positive n, it is the number of leading zero bits minus one. For negative n, it is the number of leading one bits minus one. Note that leading_sign_bits n + signed_bitsize n = {!Sys.int_size}.

since 5.5

ocaml
val trailing_zeros : t -> int
reasonml
let trailing_zeros: t => int;

trailing_zeros n is the number of trailing (least significant) 0 bits in the binary representation of n. It is an integer between 0 and Sys.int_size inclusive. It is the largest integer i <= {!Sys.int_size} such that 2{^i} divides n evenly. For example, trailing_zeros n = 0 if and only if n is odd, and trailing_zeros n = {!Sys.int_size} if and only if n = zero.

since 5.5

Converting

ocaml
val to_float : int -> float
reasonml
let to_float: int => float;

to_float x is x as a floating point number.

ocaml
val of_float : float -> int
reasonml
let of_float: float => int;

of_float x truncates x to an integer. The result is unspecified if the argument is nan or falls outside the range of representable integers.

ocaml
val to_string : int -> string
reasonml
let to_string: int => string;

to_string x is the written representation of x in decimal.

ocaml
val seeded_hash : int -> int -> int
reasonml
let seeded_hash: int => int => int;

A seeded hash function for ints, with the same output value as Hashtbl.seeded_hash. This function allows this module to be passed as argument to the functor Hashtbl.MakeSeeded.

since 5.1

ocaml
val hash : int -> int
reasonml
let hash: int => int;

An unseeded hash function for ints, with the same output value as Hashtbl.hash. This function allows this module to be passed as argument to the functor Hashtbl.Make.

since 5.1