Int32(3)

πŸ’– NAME πŸ’–

Int32 β€” 32-bit integers, bestie. that's the whole vibe. ✨

(this is the Int32 page out of the OCaml library manual, and yes we're gonna read the whole thing together 🫢)


πŸ¦‹ Module πŸ¦‹

okay so here's the actual module declaration, copy-pasted with love:

Module Int32
 : sig end

✨ Documentation ✨

so Int32 is a module and it's all about 32-bit integers, periodt. πŸ’…

This module provides operations on the type int32 of signed 32-bit integers. And here's the gag that makes it iconic: unlike the built-in int type, int32 is guaranteed to be exactly 32-bit wide on all platforms. no cap, every single platform. 🌍

All arithmetic operations over int32 are taken modulo 2^32. that's the rule, we respect it. πŸŒ€

Performance notice, bestie, listen up: values of type int32 occupy more memory space than values of type int, and arithmetic operations on int32 are generally slower than those on int. so use int32 only when your app genuinely requires exact 32-bit arithmetic. don't be out here using it for the aesthetic, it's not worth it 😭

πŸŽ€ the literals

literals for 32-bit integers are suffixed by l (that's a lowercase L, not a one, iykyk):

let zero: int32 = 0l
let one: int32 = 1l
let m_one: int32 = -1l

🌸 the values, one by one

  • val zero : int32 β€” the 32-bit integer 0. the blueprint. the origin story. 🌱
  • val one : int32 β€” the 32-bit integer 1. we love a main character. πŸ‘‘
  • val minus_one : int32 β€” the 32-bit integer -1. it's giving negative energy and we stan. πŸ’€
  • val neg : int32 -> int32 β€” unary negation. flip the sign, flip the vibe. πŸ”„
  • val add : int32 -> int32 -> int32 β€” addition, bestie. math ate. βž•
  • val sub : int32 -> int32 -> int32 β€” subtraction. βž–
  • val mul : int32 -> int32 -> int32 β€” multiplication. βœ–οΈ
  • val div : int32 -> int32 -> int32 β€” integer division. this division rounds the real quotient of its arguments towards zero, as specified for (/). Raises Division_by_zero if the second argument is zero. 🚫
  • val unsigned_div : int32 -> int32 -> int32 β€” same as Int32.div, except that arguments and result are interpreted as unsigned 32-bit integers. (since 4.08 ✨)
  • val rem : int32 -> int32 -> int32 β€” integer remainder. if y is not zero, the result of Int32.rem x y satisfies this property:
x = Int32.add (Int32.mul (Int32.div x y) y) (Int32.rem x y)

and if y = 0, then Int32.rem x y raises Division_by_zero. 🫠

  • val unsigned_rem : int32 -> int32 -> int32 β€” same as Int32.rem, except that arguments and result are interpreted as unsigned 32-bit integers. (since 4.08 ✨)
  • val fdiv : int32 -> int32 -> int32 β€” 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. (since 5.5 ✨) Raises Division_by_zero if the second argument is 0.
  • val cdiv : int32 -> int32 -> int32 β€” 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. (since 5.5 ✨) Raises Division_by_zero if the second argument is 0.
  • val ediv : int32 -> int32 -> int32 β€” 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. (since 5.5 ✨) Raises Division_by_zero if the second argument is 0.
  • val erem : int32 -> int32 -> int32 β€” 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. (since 5.5 ✨) Raises Division_by_zero if the second argument is 0.
  • val succ : int32 -> int32 β€” successor. Int32.succ x is Int32.add x Int32.one. one step forward, always. πŸšΆβ€β™€οΈ
  • val pred : int32 -> int32 β€” predecessor. Int32.pred x is Int32.sub x Int32.one. one step back. 🚢
  • val abs : int32 -> int32 β€” abs x is the absolute value of x. but on min_int this is min_int itself and thus remains negative. yes it's a jump scare, we deal πŸ’€
  • val max_int : int32 β€” the greatest representable 32-bit integer, 2^31 - 1. the ceiling, literally. πŸ”
  • val min_int : int32 β€” the smallest representable 32-bit integer, -2^31. the floor, literally. πŸ”»
  • val logand : int32 -> int32 -> int32 β€” bitwise logical and.
  • val logor : int32 -> int32 -> int32 β€” bitwise logical or.
  • val logxor : int32 -> int32 -> int32 β€” bitwise logical exclusive or.
  • val lognot : int32 -> int32 β€” bitwise logical negation.
  • val shift_left : int32 -> int -> int32 β€” Int32.shift_left x y shifts x to the left by y bits. ⚠️ the result is unspecified if y < 0 or y >= 32. do not test this, it's not a personality trait.
  • val shift_right : int32 -> int -> int32 β€” Int32.shift_right x y shifts x to the right by y bits. this is an arithmetic shift: the sign bit of x is replicated and inserted in the vacated bits. ⚠️ the result is unspecified if y < 0 or y >= 32.
  • val shift_right_logical : int32 -> int -> int32 β€” Int32.shift_right_logical x y shifts x to the right by y bits. this is a logical shift: zeroes are inserted in the vacated bits regardless of the sign of x. ⚠️ the result is unspecified if y < 0 or y >= 32.
  • val of_int : int -> int32 β€” convert the given integer (type int) to a 32-bit integer (type int32). on 64-bit platforms, the argument is taken modulo 2^32. 🎒
  • val to_int : int32 -> int β€” convert the given 32-bit integer (type int32) to an integer (type int). on 32-bit platforms, the 32-bit integer is taken modulo 2^31, i.e. the high-order bit is lost during the conversion 😭. on 64-bit platforms, the conversion is exact. slay.
  • val unsigned_to_int : int32 -> int option β€” same as Int32.to_int, but interprets the argument as an unsigned integer. returns None if the unsigned value of the argument cannot fit into an int. (since 4.08 ✨)
  • val of_float : float -> int32 β€” convert the given floating-point number to a 32-bit integer, discarding the fractional part (truncate towards 0). if the truncated floating-point number is outside the range [ Int32.min_int , Int32.max_int ], no exception is raised, and an unspecified, platform-dependent integer is returned. πŸ™ˆ so like... it's giving chaos but silently.
  • val to_float : int32 -> float β€” convert the given 32-bit integer to a floating-point number.
  • val of_string : string -> int32 β€” convert the given string to a 32-bit integer. the string is read in decimal (by default, or if the string begins with 0u) or in hexadecimal, octal or binary if the string begins with 0x, 0o or 0b respectively. πŸ”’ the 0u prefix reads the input as an unsigned integer in the range [0, 2*Int32.max_int+1]. if the input exceeds Int32.max_int it is converted to the signed integer Int32.min_int + input - Int32.max_int - 1. the _ (underscore) character can appear anywhere in the string and is ignored. cute. Raises Failure if the given string is not a valid representation of an integer, or if the integer represented exceeds the range of integers representable in type int32.
  • val of_string_opt : string -> int32 option β€” same as of_string, but return None instead of raising. (since 4.05 ✨) no drama, just None.
  • val to_string : int32 -> string β€” return the string representation of its argument, in signed decimal.
  • val bits_of_float : float -> int32 β€” return the internal representation of the given float according to the IEEE 754 floating-point 'single format' bit layout. bit 31 of the result represents the sign of the float; bits 30 to 23 represent the (biased) exponent; bits 22 to 0 represent the mantissa. πŸ”¬
  • val float_of_bits : int32 -> float β€” return the floating-point number whose internal representation, according to the IEEE 754 floating-point 'single format' bit layout, is the given int32. the reverse glow-up of bits_of_float. πŸ¦‹
  • type t = int32 β€” an alias for the type of 32-bit integers. same energy, different name. πŸ’«
  • val compare : t -> t -> int β€” the comparison function for 32-bit integers, with the same specification as compare. along with the type t, this function compare allows the module Int32 to be passed as argument to the functors Set.Make and Map.Make. πŸ‘‘
  • val unsigned_compare : t -> t -> int β€” same as Int32.compare, except that arguments are interpreted as unsigned 32-bit integers. (since 4.08 ✨)
  • val equal : t -> t -> bool β€” the equal function for int32s. (since 4.03 ✨)
  • val min : t -> t -> t β€” return the smaller of the two arguments. (since 4.13 ✨)
  • val max : t -> t -> t β€” return the greater of the two arguments. (since 4.13 ✨)
  • val 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 ✨)
  • val 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 32 inclusive such that 0 <= n < 2{^i} (unsigned). (since 5.5 ✨)
  • val 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 32 inclusive such that -2{^i-1} <= n < 2{^i-1} (signed). (since 5.5 ✨)
  • val 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 32 inclusive. if n is negative, leading_zeros n = 0 since the most significant bit of n is 1. leading_zeros n = 32 if and only if n = zero. note that leading_zeros n + unsigned_bitsize n = 32. (since 5.5 ✨)
  • val 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 31 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 = 32. (since 5.5 ✨)
  • val 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 32 inclusive. it is the largest integer i <= 32 such that 2{^i} divides n evenly. for example, trailing_zeros n = 0 if and only if n is odd, and trailing_zeros n = 32 if and only if n = zero. (since 5.5 ✨)
  • val seeded_hash : int -> t -> int β€” a seeded hash function for 32-bit 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 ✨)
  • val hash : t -> int β€” an unseeded hash function for 32-bit 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 ✨)

and that's the whole page, bestie, we read it, we understood it, we're basically 32-bit literate now πŸ’œ

🧚 this cuteness was brought to you by OCamldoc, version dated 2026-06-22, and it's the Int32(3) page β€” ok bye, go write some 0l literals responsibly πŸ’…βœ¨πŸŽ€
πŸ“¦ where this page comes from