doc.rust-lang.org

i128 - Rust

  • ️Mon Feb 17 2025

Primitive Type i128

1.26.0

Expand description

The 128-bit signed integer type.

Source§
1.43.0 · Source

The smallest value that can be represented by this integer type (−2127).

§Examples

Basic usage:

assert_eq!(i128::MIN, -170141183460469231731687303715884105728);
1.43.0 · Source

The largest value that can be represented by this integer type (2127 − 1).

§Examples

Basic usage:

assert_eq!(i128::MAX, 170141183460469231731687303715884105727);
1.53.0 · Source

The size of this integer type in bits.

§Examples
assert_eq!(i128::BITS, 128);
1.0.0 (const: 1.32.0) · Source

Returns the number of ones in the binary representation of self.

§Examples

Basic usage:

let n = 0b100_0000i128;
assert_eq!(n.count_ones(), 1);
1.0.0 (const: 1.32.0) · Source

Returns the number of zeros in the binary representation of self.

§Examples

Basic usage:

assert_eq!(i128::MAX.count_zeros(), 1);
1.0.0 (const: 1.32.0) · Source

Returns the number of leading zeros in the binary representation of self.

Depending on what you’re doing with the value, you might also be interested in the ilog2 function which returns a consistent number, even if the type widens.

§Examples

Basic usage:

let n = -1i128;
assert_eq!(n.leading_zeros(), 0);
1.0.0 (const: 1.32.0) · Source

Returns the number of trailing zeros in the binary representation of self.

§Examples

Basic usage:

let n = -4i128;
assert_eq!(n.trailing_zeros(), 2);
1.46.0 (const: 1.46.0) · Source

Returns the number of leading ones in the binary representation of self.

§Examples

Basic usage:

let n = -1i128;
assert_eq!(n.leading_ones(), 128);
1.46.0 (const: 1.46.0) · Source

Returns the number of trailing ones in the binary representation of self.

§Examples

Basic usage:

let n = 3i128;
assert_eq!(n.trailing_ones(), 2);
Source

🔬This is a nightly-only experimental API. (integer_sign_cast #125882)

Returns the bit pattern of self reinterpreted as an unsigned integer of the same size.

This produces the same result as an as cast, but ensures that the bit-width remains the same.

§Examples

Basic usage:

#![feature(integer_sign_cast)]
let n = -1i128;
assert_eq!(n.cast_unsigned(), u128::MAX);
1.0.0 (const: 1.32.0) · Source

Shifts the bits to the left by a specified amount, n, wrapping the truncated bits to the end of the resulting integer.

Please note this isn’t the same operation as the << shifting operator!

§Examples

Basic usage:

let n = 0x13f40000000000000000000000004f76i128;
let m = 0x4f7613f4;
assert_eq!(n.rotate_left(16), m);
1.0.0 (const: 1.32.0) · Source

Shifts the bits to the right by a specified amount, n, wrapping the truncated bits to the beginning of the resulting integer.

Please note this isn’t the same operation as the >> shifting operator!

§Examples

Basic usage:

let n = 0x4f7613f4i128;
let m = 0x13f40000000000000000000000004f76;
assert_eq!(n.rotate_right(16), m);
1.0.0 (const: 1.32.0) · Source

Reverses the byte order of the integer.

§Examples

Basic usage:

let n = 0x12345678901234567890123456789012i128;
let m = n.swap_bytes();
assert_eq!(m, 0x12907856341290785634129078563412);
1.37.0 (const: 1.37.0) · Source

Reverses the order of bits in the integer. The least significant bit becomes the most significant bit, second least-significant bit becomes second most-significant bit, etc.

§Examples

Basic usage:

let n = 0x12345678901234567890123456789012i128;
let m = n.reverse_bits();
assert_eq!(m, 0x48091e6a2c48091e6a2c48091e6a2c48);
assert_eq!(0, 0i128.reverse_bits());
1.0.0 (const: 1.32.0) · Source

Converts an integer from big endian to the target’s endianness.

On big endian this is a no-op. On little endian the bytes are swapped.

§Examples

Basic usage:

let n = 0x1Ai128;
if cfg!(target_endian = "big") {
    assert_eq!(i128::from_be(n), n)
} else {
    assert_eq!(i128::from_be(n), n.swap_bytes())
}
1.0.0 (const: 1.32.0) · Source

Converts an integer from little endian to the target’s endianness.

On little endian this is a no-op. On big endian the bytes are swapped.

§Examples

Basic usage:

let n = 0x1Ai128;
if cfg!(target_endian = "little") {
    assert_eq!(i128::from_le(n), n)
} else {
    assert_eq!(i128::from_le(n), n.swap_bytes())
}
1.0.0 (const: 1.32.0) · Source

Converts self to big endian from the target’s endianness.

On big endian this is a no-op. On little endian the bytes are swapped.

§Examples

Basic usage:

let n = 0x1Ai128;
if cfg!(target_endian = "big") {
    assert_eq!(n.to_be(), n)
} else {
    assert_eq!(n.to_be(), n.swap_bytes())
}
1.0.0 (const: 1.32.0) · Source

Converts self to little endian from the target’s endianness.

On little endian this is a no-op. On big endian the bytes are swapped.

§Examples

Basic usage:

let n = 0x1Ai128;
if cfg!(target_endian = "little") {
    assert_eq!(n.to_le(), n)
} else {
    assert_eq!(n.to_le(), n.swap_bytes())
}
1.0.0 (const: 1.47.0) · Source

Checked integer addition. Computes self + rhs, returning None if overflow occurred.

§Examples

Basic usage:

assert_eq!((i128::MAX - 2).checked_add(1), Some(i128::MAX - 1));
assert_eq!((i128::MAX - 2).checked_add(3), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict integer addition. Computes self + rhs, panicking if overflow occurred.

§Panics
§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!((i128::MAX - 2).strict_add(1), i128::MAX - 1);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = (i128::MAX - 2).strict_add(3);
1.79.0 (const: 1.79.0) · Source

Unchecked integer addition. Computes self + rhs, assuming overflow cannot occur.

Calling x.unchecked_add(y) is semantically equivalent to calling x.checked_add(y).unwrap_unchecked().

If you’re just trying to avoid the panic in debug mode, then do not use this. Instead, you’re looking for wrapping_add.

§Safety

This results in undefined behavior when self + rhs > i128::MAX or self + rhs < i128::MIN, i.e. when checked_add would return None.

1.66.0 (const: 1.66.0) · Source

Checked addition with an unsigned integer. Computes self + rhs, returning None if overflow occurred.

§Examples

Basic usage:

assert_eq!(1i128.checked_add_unsigned(2), Some(3));
assert_eq!((i128::MAX - 2).checked_add_unsigned(3), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict addition with an unsigned integer. Computes self + rhs, panicking if overflow occurred.

§Panics
§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!(1i128.strict_add_unsigned(2), 3);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = (i128::MAX - 2).strict_add_unsigned(3);
1.0.0 (const: 1.47.0) · Source

Checked integer subtraction. Computes self - rhs, returning None if overflow occurred.

§Examples

Basic usage:

assert_eq!((i128::MIN + 2).checked_sub(1), Some(i128::MIN + 1));
assert_eq!((i128::MIN + 2).checked_sub(3), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict integer subtraction. Computes self - rhs, panicking if overflow occurred.

§Panics
§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!((i128::MIN + 2).strict_sub(1), i128::MIN + 1);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = (i128::MIN + 2).strict_sub(3);
1.79.0 (const: 1.79.0) · Source

Unchecked integer subtraction. Computes self - rhs, assuming overflow cannot occur.

Calling x.unchecked_sub(y) is semantically equivalent to calling x.checked_sub(y).unwrap_unchecked().

If you’re just trying to avoid the panic in debug mode, then do not use this. Instead, you’re looking for wrapping_sub.

§Safety

This results in undefined behavior when self - rhs > i128::MAX or self - rhs < i128::MIN, i.e. when checked_sub would return None.

1.66.0 (const: 1.66.0) · Source

Checked subtraction with an unsigned integer. Computes self - rhs, returning None if overflow occurred.

§Examples

Basic usage:

assert_eq!(1i128.checked_sub_unsigned(2), Some(-1));
assert_eq!((i128::MIN + 2).checked_sub_unsigned(3), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict subtraction with an unsigned integer. Computes self - rhs, panicking if overflow occurred.

§Panics
§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!(1i128.strict_sub_unsigned(2), -1);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = (i128::MIN + 2).strict_sub_unsigned(3);
1.0.0 (const: 1.47.0) · Source

Checked integer multiplication. Computes self * rhs, returning None if overflow occurred.

§Examples

Basic usage:

assert_eq!(i128::MAX.checked_mul(1), Some(i128::MAX));
assert_eq!(i128::MAX.checked_mul(2), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict integer multiplication. Computes self * rhs, panicking if overflow occurred.

§Panics
§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!(i128::MAX.strict_mul(1), i128::MAX);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = i128::MAX.strict_mul(2);
1.79.0 (const: 1.79.0) · Source

Unchecked integer multiplication. Computes self * rhs, assuming overflow cannot occur.

Calling x.unchecked_mul(y) is semantically equivalent to calling x.checked_mul(y).unwrap_unchecked().

If you’re just trying to avoid the panic in debug mode, then do not use this. Instead, you’re looking for wrapping_mul.

§Safety

This results in undefined behavior when self * rhs > i128::MAX or self * rhs < i128::MIN, i.e. when checked_mul would return None.

1.0.0 (const: 1.52.0) · Source

Checked integer division. Computes self / rhs, returning None if rhs == 0 or the division results in overflow.

§Examples

Basic usage:

assert_eq!((i128::MIN + 1).checked_div(-1), Some(170141183460469231731687303715884105727));
assert_eq!(i128::MIN.checked_div(-1), None);
assert_eq!((1i128).checked_div(0), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict integer division. Computes self / rhs, panicking if overflow occurred.

§Panics

This function will panic if rhs is zero.

§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

The only case where such an overflow can occur is when one divides MIN / -1 on a signed type (where MIN is the negative minimal value for the type); this is equivalent to -MIN, a positive value that is too large to represent in the type.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!((i128::MIN + 1).strict_div(-1), 170141183460469231731687303715884105727);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = i128::MIN.strict_div(-1);

The following panics because of division by zero:

#![feature(strict_overflow_ops)]
let _ = (1i128).strict_div(0);
1.38.0 (const: 1.52.0) · Source

Checked Euclidean division. Computes self.div_euclid(rhs), returning None if rhs == 0 or the division results in overflow.

§Examples

Basic usage:

assert_eq!((i128::MIN + 1).checked_div_euclid(-1), Some(170141183460469231731687303715884105727));
assert_eq!(i128::MIN.checked_div_euclid(-1), None);
assert_eq!((1i128).checked_div_euclid(0), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict Euclidean division. Computes self.div_euclid(rhs), panicking if overflow occurred.

§Panics

This function will panic if rhs is zero.

§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

The only case where such an overflow can occur is when one divides MIN / -1 on a signed type (where MIN is the negative minimal value for the type); this is equivalent to -MIN, a positive value that is too large to represent in the type.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!((i128::MIN + 1).strict_div_euclid(-1), 170141183460469231731687303715884105727);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = i128::MIN.strict_div_euclid(-1);

The following panics because of division by zero:

#![feature(strict_overflow_ops)]
let _ = (1i128).strict_div_euclid(0);
1.7.0 (const: 1.52.0) · Source

Checked integer remainder. Computes self % rhs, returning None if rhs == 0 or the division results in overflow.

§Examples

Basic usage:

assert_eq!(5i128.checked_rem(2), Some(1));
assert_eq!(5i128.checked_rem(0), None);
assert_eq!(i128::MIN.checked_rem(-1), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict integer remainder. Computes self % rhs, panicking if the division results in overflow.

§Panics

This function will panic if rhs is zero.

§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

The only case where such an overflow can occur is x % y for MIN / -1 on a signed type (where MIN is the negative minimal value), which is invalid due to implementation artifacts.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!(5i128.strict_rem(2), 1);

The following panics because of division by zero:

#![feature(strict_overflow_ops)]
let _ = 5i128.strict_rem(0);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = i128::MIN.strict_rem(-1);
1.38.0 (const: 1.52.0) · Source

Checked Euclidean remainder. Computes self.rem_euclid(rhs), returning None if rhs == 0 or the division results in overflow.

§Examples

Basic usage:

assert_eq!(5i128.checked_rem_euclid(2), Some(1));
assert_eq!(5i128.checked_rem_euclid(0), None);
assert_eq!(i128::MIN.checked_rem_euclid(-1), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict Euclidean remainder. Computes self.rem_euclid(rhs), panicking if the division results in overflow.

§Panics

This function will panic if rhs is zero.

§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

The only case where such an overflow can occur is x % y for MIN / -1 on a signed type (where MIN is the negative minimal value), which is invalid due to implementation artifacts.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!(5i128.strict_rem_euclid(2), 1);

The following panics because of division by zero:

#![feature(strict_overflow_ops)]
let _ = 5i128.strict_rem_euclid(0);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = i128::MIN.strict_rem_euclid(-1);
1.7.0 (const: 1.47.0) · Source

Checked negation. Computes -self, returning None if self == MIN.

§Examples

Basic usage:

assert_eq!(5i128.checked_neg(), Some(-5));
assert_eq!(i128::MIN.checked_neg(), None);
Source

🔬This is a nightly-only experimental API. (unchecked_neg #85122)

Unchecked negation. Computes -self, assuming overflow cannot occur.

§Safety

This results in undefined behavior when self == i128::MIN, i.e. when checked_neg would return None.

Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict negation. Computes -self, panicking if self == MIN.

§Panics
§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!(5i128.strict_neg(), -5);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = i128::MIN.strict_neg();
1.7.0 (const: 1.47.0) · Source

Checked shift left. Computes self << rhs, returning None if rhs is larger than or equal to the number of bits in self.

§Examples

Basic usage:

assert_eq!(0x1i128.checked_shl(4), Some(0x10));
assert_eq!(0x1i128.checked_shl(129), None);
assert_eq!(0x10i128.checked_shl(127), Some(0));
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict shift left. Computes self << rhs, panicking if rhs is larger than or equal to the number of bits in self.

§Panics
§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!(0x1i128.strict_shl(4), 0x10);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = 0x1i128.strict_shl(129);
Source

🔬This is a nightly-only experimental API. (unchecked_shifts #85122)

Unchecked shift left. Computes self << rhs, assuming that rhs is less than the number of bits in self.

§Safety

This results in undefined behavior if rhs is larger than or equal to the number of bits in self, i.e. when checked_shl would return None.

Source

🔬This is a nightly-only experimental API. (unbounded_shifts #129375)

Unbounded shift left. Computes self << rhs, without bounding the value of rhs.

If rhs is larger or equal to the number of bits in self, the entire value is shifted out, and 0 is returned.

§Examples

Basic usage:

#![feature(unbounded_shifts)]
assert_eq!(0x1i128.unbounded_shl(4), 0x10);
assert_eq!(0x1i128.unbounded_shl(129), 0);
1.7.0 (const: 1.47.0) · Source

Checked shift right. Computes self >> rhs, returning None if rhs is larger than or equal to the number of bits in self.

§Examples

Basic usage:

assert_eq!(0x10i128.checked_shr(4), Some(0x1));
assert_eq!(0x10i128.checked_shr(128), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict shift right. Computes self >> rhs, panicking rhs is larger than or equal to the number of bits in self.

§Panics
§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!(0x10i128.strict_shr(4), 0x1);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = 0x10i128.strict_shr(128);
Source

🔬This is a nightly-only experimental API. (unchecked_shifts #85122)

Unchecked shift right. Computes self >> rhs, assuming that rhs is less than the number of bits in self.

§Safety

This results in undefined behavior if rhs is larger than or equal to the number of bits in self, i.e. when checked_shr would return None.

Source

🔬This is a nightly-only experimental API. (unbounded_shifts #129375)

Unbounded shift right. Computes self >> rhs, without bounding the value of rhs.

If rhs is larger or equal to the number of bits in self, the entire value is shifted out, which yields 0 for a positive number, and -1 for a negative number.

§Examples

Basic usage:

#![feature(unbounded_shifts)]
assert_eq!(0x10i128.unbounded_shr(4), 0x1);
assert_eq!(0x10i128.unbounded_shr(129), 0);
assert_eq!(i128::MIN.unbounded_shr(129), -1);
1.13.0 (const: 1.47.0) · Source

Checked absolute value. Computes self.abs(), returning None if self == MIN.

§Examples

Basic usage:

assert_eq!((-5i128).checked_abs(), Some(5));
assert_eq!(i128::MIN.checked_abs(), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict absolute value. Computes self.abs(), panicking if self == MIN.

§Panics
§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!((-5i128).strict_abs(), 5);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = i128::MIN.strict_abs();
1.34.0 (const: 1.50.0) · Source

Checked exponentiation. Computes self.pow(exp), returning None if overflow occurred.

§Examples

Basic usage:

assert_eq!(8i128.checked_pow(2), Some(64));
assert_eq!(i128::MAX.checked_pow(2), None);
Source

🔬This is a nightly-only experimental API. (strict_overflow_ops #118260)

Strict exponentiation. Computes self.pow(exp), panicking if overflow occurred.

§Panics
§Overflow behavior

This function will always panic on overflow, regardless of whether overflow checks are enabled.

§Examples

Basic usage:

#![feature(strict_overflow_ops)]
assert_eq!(8i128.strict_pow(2), 64);

The following panics because of overflow:

#![feature(strict_overflow_ops)]
let _ = i128::MAX.strict_pow(2);
1.84.0 (const: 1.84.0) · Source

Returns the square root of the number, rounded down.

Returns None if self is negative.

§Examples

Basic usage:

assert_eq!(10i128.checked_isqrt(), Some(3));
1.0.0 (const: 1.47.0) · Source

Saturating integer addition. Computes self + rhs, saturating at the numeric bounds instead of overflowing.

§Examples

Basic usage:

assert_eq!(100i128.saturating_add(1), 101);
assert_eq!(i128::MAX.saturating_add(100), i128::MAX);
assert_eq!(i128::MIN.saturating_add(-1), i128::MIN);
1.66.0 (const: 1.66.0) · Source

Saturating addition with an unsigned integer. Computes self + rhs, saturating at the numeric bounds instead of overflowing.

§Examples

Basic usage:

assert_eq!(1i128.saturating_add_unsigned(2), 3);
assert_eq!(i128::MAX.saturating_add_unsigned(100), i128::MAX);
1.0.0 (const: 1.47.0) · Source

Saturating integer subtraction. Computes self - rhs, saturating at the numeric bounds instead of overflowing.

§Examples

Basic usage:

assert_eq!(100i128.saturating_sub(127), -27);
assert_eq!(i128::MIN.saturating_sub(100), i128::MIN);
assert_eq!(i128::MAX.saturating_sub(-1), i128::MAX);
1.66.0 (const: 1.66.0) · Source

Saturating subtraction with an unsigned integer. Computes self - rhs, saturating at the numeric bounds instead of overflowing.

§Examples

Basic usage:

assert_eq!(100i128.saturating_sub_unsigned(127), -27);
assert_eq!(i128::MIN.saturating_sub_unsigned(100), i128::MIN);
1.45.0 (const: 1.47.0) · Source

Saturating integer negation. Computes -self, returning MAX if self == MIN instead of overflowing.

§Examples

Basic usage:

assert_eq!(100i128.saturating_neg(), -100);
assert_eq!((-100i128).saturating_neg(), 100);
assert_eq!(i128::MIN.saturating_neg(), i128::MAX);
assert_eq!(i128::MAX.saturating_neg(), i128::MIN + 1);
1.45.0 (const: 1.47.0) · Source

Saturating absolute value. Computes self.abs(), returning MAX if self == MIN instead of overflowing.

§Examples

Basic usage:

assert_eq!(100i128.saturating_abs(), 100);
assert_eq!((-100i128).saturating_abs(), 100);
assert_eq!(i128::MIN.saturating_abs(), i128::MAX);
assert_eq!((i128::MIN + 1).saturating_abs(), i128::MAX);
1.7.0 (const: 1.47.0) · Source

Saturating integer multiplication. Computes self * rhs, saturating at the numeric bounds instead of overflowing.

§Examples

Basic usage:

assert_eq!(10i128.saturating_mul(12), 120);
assert_eq!(i128::MAX.saturating_mul(10), i128::MAX);
assert_eq!(i128::MIN.saturating_mul(10), i128::MIN);
1.58.0 (const: 1.58.0) · Source

Saturating integer division. Computes self / rhs, saturating at the numeric bounds instead of overflowing.

§Panics

This function will panic if rhs is zero.

§Examples

Basic usage:

assert_eq!(5i128.saturating_div(2), 2);
assert_eq!(i128::MAX.saturating_div(-1), i128::MIN + 1);
assert_eq!(i128::MIN.saturating_div(-1), i128::MAX);
1.34.0 (const: 1.50.0) · Source

Saturating integer exponentiation. Computes self.pow(exp), saturating at the numeric bounds instead of overflowing.

§Examples

Basic usage:

assert_eq!((-4i128).saturating_pow(3), -64);
assert_eq!(i128::MIN.saturating_pow(2), i128::MAX);
assert_eq!(i128::MIN.saturating_pow(3), i128::MIN);
1.0.0 (const: 1.32.0) · Source

Wrapping (modular) addition. Computes self + rhs, wrapping around at the boundary of the type.

§Examples

Basic usage:

assert_eq!(100i128.wrapping_add(27), 127);
assert_eq!(i128::MAX.wrapping_add(2), i128::MIN + 1);
1.66.0 (const: 1.66.0) · Source

Wrapping (modular) addition with an unsigned integer. Computes self + rhs, wrapping around at the boundary of the type.

§Examples

Basic usage:

assert_eq!(100i128.wrapping_add_unsigned(27), 127);
assert_eq!(i128::MAX.wrapping_add_unsigned(2), i128::MIN + 1);
1.0.0 (const: 1.32.0) · Source

Wrapping (modular) subtraction. Computes self - rhs, wrapping around at the boundary of the type.

§Examples

Basic usage:

assert_eq!(0i128.wrapping_sub(127), -127);
assert_eq!((-2i128).wrapping_sub(i128::MAX), i128::MAX);
1.66.0 (const: 1.66.0) · Source

Wrapping (modular) subtraction with an unsigned integer. Computes self - rhs, wrapping around at the boundary of the type.

§Examples

Basic usage:

assert_eq!(0i128.wrapping_sub_unsigned(127), -127);
assert_eq!((-2i128).wrapping_sub_unsigned(u128::MAX), -1);
1.0.0 (const: 1.32.0) · Source

Wrapping (modular) multiplication. Computes self * rhs, wrapping around at the boundary of the type.

§Examples

Basic usage:

assert_eq!(10i128.wrapping_mul(12), 120);
assert_eq!(11i8.wrapping_mul(12), -124);
1.2.0 (const: 1.52.0) · Source

Wrapping (modular) division. Computes self / rhs, wrapping around at the boundary of the type.

The only case where such wrapping can occur is when one divides MIN / -1 on a signed type (where MIN is the negative minimal value for the type); this is equivalent to -MIN, a positive value that is too large to represent in the type. In such a case, this function returns MIN itself.

§Panics

This function will panic if rhs is zero.

§Examples

Basic usage:

assert_eq!(100i128.wrapping_div(10), 10);
assert_eq!((-128i8).wrapping_div(-1), -128);
1.38.0 (const: 1.52.0) · Source

Wrapping Euclidean division. Computes self.div_euclid(rhs), wrapping around at the boundary of the type.

Wrapping will only occur in MIN / -1 on a signed type (where MIN is the negative minimal value for the type). This is equivalent to -MIN, a positive value that is too large to represent in the type. In this case, this method returns MIN itself.

§Panics

This function will panic if rhs is zero.

§Examples

Basic usage:

assert_eq!(100i128.wrapping_div_euclid(10), 10);
assert_eq!((-128i8).wrapping_div_euclid(-1), -128);
1.2.0 (const: 1.52.0) · Source

Wrapping (modular) remainder. Computes self % rhs, wrapping around at the boundary of the type.

Such wrap-around never actually occurs mathematically; implementation artifacts make x % y invalid for MIN / -1 on a signed type (where MIN is the negative minimal value). In such a case, this function returns 0.

§Panics

This function will panic if rhs is zero.

§Examples

Basic usage:

assert_eq!(100i128.wrapping_rem(10), 0);
assert_eq!((-128i8).wrapping_rem(-1), 0);
1.38.0 (const: 1.52.0) · Source

Wrapping Euclidean remainder. Computes self.rem_euclid(rhs), wrapping around at the boundary of the type.

Wrapping will only occur in MIN % -1 on a signed type (where MIN is the negative minimal value for the type). In this case, this method returns 0.

§Panics

This function will panic if rhs is zero.

§Examples

Basic usage:

assert_eq!(100i128.wrapping_rem_euclid(10), 0);
assert_eq!((-128i8).wrapping_rem_euclid(-1), 0);
1.2.0 (const: 1.32.0) · Source

Wrapping (modular) negation. Computes -self, wrapping around at the boundary of the type.

The only case where such wrapping can occur is when one negates MIN on a signed type (where MIN is the negative minimal value for the type); this is a positive value that is too large to represent in the type. In such a case, this function returns MIN itself.

§Examples

Basic usage:

assert_eq!(100i128.wrapping_neg(), -100);
assert_eq!((-100i128).wrapping_neg(), 100);
assert_eq!(i128::MIN.wrapping_neg(), i128::MIN);
1.2.0 (const: 1.32.0) · Source

Panic-free bitwise shift-left; yields self << mask(rhs), where mask removes any high-order bits of rhs that would cause the shift to exceed the bitwidth of the type.

Note that this is not the same as a rotate-left; the RHS of a wrapping shift-left is restricted to the range of the type, rather than the bits shifted out of the LHS being returned to the other end. The primitive integer types all implement a rotate_left function, which may be what you want instead.

§Examples

Basic usage:

assert_eq!((-1i128).wrapping_shl(7), -128);
assert_eq!((-1i128).wrapping_shl(128), -1);
1.2.0 (const: 1.32.0) · Source

Panic-free bitwise shift-right; yields self >> mask(rhs), where mask removes any high-order bits of rhs that would cause the shift to exceed the bitwidth of the type.

Note that this is not the same as a rotate-right; the RHS of a wrapping shift-right is restricted to the range of the type, rather than the bits shifted out of the LHS being returned to the other end. The primitive integer types all implement a rotate_right function, which may be what you want instead.

§Examples

Basic usage:

assert_eq!((-128i128).wrapping_shr(7), -1);
assert_eq!((-128i16).wrapping_shr(64), -128);
1.13.0 (const: 1.32.0) · Source

Wrapping (modular) absolute value. Computes self.abs(), wrapping around at the boundary of the type.

The only case where such wrapping can occur is when one takes the absolute value of the negative minimal value for the type; this is a positive value that is too large to represent in the type. In such a case, this function returns MIN itself.

§Examples

Basic usage:

assert_eq!(100i128.wrapping_abs(), 100);
assert_eq!((-100i128).wrapping_abs(), 100);
assert_eq!(i128::MIN.wrapping_abs(), i128::MIN);
assert_eq!((-128i8).wrapping_abs() as u8, 128);
1.51.0 (const: 1.51.0) · Source

Computes the absolute value of self without any wrapping or panicking.

§Examples

Basic usage:

assert_eq!(100i128.unsigned_abs(), 100u128);
assert_eq!((-100i128).unsigned_abs(), 100u128);
assert_eq!((-128i8).unsigned_abs(), 128u8);
1.34.0 (const: 1.50.0) · Source

Wrapping (modular) exponentiation. Computes self.pow(exp), wrapping around at the boundary of the type.

§Examples

Basic usage:

assert_eq!(3i128.wrapping_pow(4), 81);
assert_eq!(3i8.wrapping_pow(5), -13);
assert_eq!(3i8.wrapping_pow(6), -39);
1.7.0 (const: 1.32.0) · Source

Calculates self + rhs.

Returns a tuple of the addition along with a boolean indicating whether an arithmetic overflow would occur. If an overflow would have occurred then the wrapped value is returned.

§Examples

Basic usage:

assert_eq!(5i128.overflowing_add(2), (7, false));
assert_eq!(i128::MAX.overflowing_add(1), (i128::MIN, true));
Source

🔬This is a nightly-only experimental API. (bigint_helper_methods #85532)

Calculates self + rhs + carry and checks for overflow.

Performs “ternary addition” of two integer operands and a carry-in bit, and returns a tuple of the sum along with a boolean indicating whether an arithmetic overflow would occur. On overflow, the wrapped value is returned.

This allows chaining together multiple additions to create a wider addition, and can be useful for bignum addition. This method should only be used for the most significant word; for the less significant words the unsigned method u128::carrying_add should be used.

The output boolean returned by this method is not a carry flag, and should not be added to a more significant word.

If the input carry is false, this method is equivalent to overflowing_add.

§Examples
#![feature(bigint_helper_methods)]
// Only the most significant word is signed.
//
//   10  MAX    (a = 10 × 2^128 + 2^128 - 1)
// + -5    9    (b = -5 × 2^128 + 9)
// ---------
//    6    8    (sum = 6 × 2^128 + 8)
let (a1, a0): (i128, u128) = (10, u128::MAX);
let (b1, b0): (i128, u128) = (-5, 9);
let carry0 = false;
// u128::carrying_add for the less significant words
let (sum0, carry1) = a0.carrying_add(b0, carry0);
assert_eq!(carry1, true);
// i128::carrying_add for the most significant word
let (sum1, overflow) = a1.carrying_add(b1, carry1);
assert_eq!(overflow, false);
assert_eq!((sum1, sum0), (6, 8));
1.66.0 (const: 1.66.0) · Source

Calculates self + rhs with an unsigned rhs.

Returns a tuple of the addition along with a boolean indicating whether an arithmetic overflow would occur. If an overflow would have occurred then the wrapped value is returned.

§Examples

Basic usage:

assert_eq!(1i128.overflowing_add_unsigned(2), (3, false));
assert_eq!((i128::MIN).overflowing_add_unsigned(u128::MAX), (i128::MAX, false));
assert_eq!((i128::MAX - 2).overflowing_add_unsigned(3), (i128::MIN, true));
1.7.0 (const: 1.32.0) · Source

Calculates self - rhs.

Returns a tuple of the subtraction along with a boolean indicating whether an arithmetic overflow would occur. If an overflow would have occurred then the wrapped value is returned.

§Examples

Basic usage:

assert_eq!(5i128.overflowing_sub(2), (3, false));
assert_eq!(i128::MIN.overflowing_sub(1), (i128::MAX, true));
Source

🔬This is a nightly-only experimental API. (bigint_helper_methods #85532)

Calculates selfrhsborrow and checks for overflow.

Performs “ternary subtraction” by subtracting both an integer operand and a borrow-in bit from self, and returns a tuple of the difference along with a boolean indicating whether an arithmetic overflow would occur. On overflow, the wrapped value is returned.

This allows chaining together multiple subtractions to create a wider subtraction, and can be useful for bignum subtraction. This method should only be used for the most significant word; for the less significant words the unsigned method u128::borrowing_sub should be used.

The output boolean returned by this method is not a borrow flag, and should not be subtracted from a more significant word.

If the input borrow is false, this method is equivalent to overflowing_sub.

§Examples
#![feature(bigint_helper_methods)]
// Only the most significant word is signed.
//
//    6    8    (a = 6 × 2^128 + 8)
// - -5    9    (b = -5 × 2^128 + 9)
// ---------
//   10  MAX    (diff = 10 × 2^128 + 2^128 - 1)
let (a1, a0): (i128, u128) = (6, 8);
let (b1, b0): (i128, u128) = (-5, 9);
let borrow0 = false;
// u128::borrowing_sub for the less significant words
let (diff0, borrow1) = a0.borrowing_sub(b0, borrow0);
assert_eq!(borrow1, true);
// i128::borrowing_sub for the most significant word
let (diff1, overflow) = a1.borrowing_sub(b1, borrow1);
assert_eq!(overflow, false);
assert_eq!((diff1, diff0), (10, u128::MAX));
1.66.0 (const: 1.66.0) · Source

Calculates self - rhs with an unsigned rhs.

Returns a tuple of the subtraction along with a boolean indicating whether an arithmetic overflow would occur. If an overflow would have occurred then the wrapped value is returned.

§Examples

Basic usage:

assert_eq!(1i128.overflowing_sub_unsigned(2), (-1, false));
assert_eq!((i128::MAX).overflowing_sub_unsigned(u128::MAX), (i128::MIN, false));
assert_eq!((i128::MIN + 2).overflowing_sub_unsigned(3), (i128::MAX, true));
1.7.0 (const: 1.32.0) · Source

Calculates the multiplication of self and rhs.

Returns a tuple of the multiplication along with a boolean indicating whether an arithmetic overflow would occur. If an overflow would have occurred then the wrapped value is returned.

§Examples

Basic usage:

assert_eq!(5i128.overflowing_mul(2), (10, false));
assert_eq!(1_000_000_000i32.overflowing_mul(10), (1410065408, true));
Source

🔬This is a nightly-only experimental API. (bigint_helper_methods #85532)

Calculates the complete product self * rhs without the possibility to overflow.

This returns the low-order (wrapping) bits and the high-order (overflow) bits of the result as two separate values, in that order.

If you also need to add a carry to the wide result, then you want Self::carrying_mul instead.

§Examples

Basic usage:

Please note that this example is shared between integer types. Which explains why i32 is used here.

#![feature(bigint_helper_methods)]
assert_eq!(5i32.widening_mul(-2), (4294967286, -1));
assert_eq!(1_000_000_000i32.widening_mul(-10), (2884901888, -3));
Source

🔬This is a nightly-only experimental API. (bigint_helper_methods #85532)

Calculates the “full multiplication” self * rhs + carry without the possibility to overflow.

This returns the low-order (wrapping) bits and the high-order (overflow) bits of the result as two separate values, in that order.

Performs “long multiplication” which takes in an extra amount to add, and may return an additional amount of overflow. This allows for chaining together multiple multiplications to create “big integers” which represent larger values.

If you don’t need the carry, then you can use Self::widening_mul instead.

§Examples

Basic usage:

Please note that this example is shared between integer types. Which explains why i32 is used here.

#![feature(bigint_helper_methods)]
assert_eq!(5i32.carrying_mul(-2, 0), (4294967286, -1));
assert_eq!(5i32.carrying_mul(-2, 10), (0, 0));
assert_eq!(1_000_000_000i32.carrying_mul(-10, 0), (2884901888, -3));
assert_eq!(1_000_000_000i32.carrying_mul(-10, 10), (2884901898, -3));
assert_eq!(i128::MAX.carrying_mul(i128::MAX, i128::MAX), (i128::MAX.unsigned_abs() + 1, i128::MAX / 2));
Source

🔬This is a nightly-only experimental API. (bigint_helper_methods #85532)

Calculates the “full multiplication” self * rhs + carry1 + carry2 without the possibility to overflow.

This returns the low-order (wrapping) bits and the high-order (overflow) bits of the result as two separate values, in that order.

Performs “long multiplication” which takes in an extra amount to add, and may return an additional amount of overflow. This allows for chaining together multiple multiplications to create “big integers” which represent larger values.

If you don’t need either carry, then you can use Self::widening_mul instead, and if you only need one carry, then you can use Self::carrying_mul instead.

§Examples

Basic usage:

Please note that this example is shared between integer types. Which explains why i32 is used here.

#![feature(bigint_helper_methods)]
assert_eq!(5i32.carrying_mul_add(-2, 0, 0), (4294967286, -1));
assert_eq!(5i32.carrying_mul_add(-2, 10, 10), (10, 0));
assert_eq!(1_000_000_000i32.carrying_mul_add(-10, 0, 0), (2884901888, -3));
assert_eq!(1_000_000_000i32.carrying_mul_add(-10, 10, 10), (2884901908, -3));
assert_eq!(i128::MAX.carrying_mul_add(i128::MAX, i128::MAX, i128::MAX), (u128::MAX, i128::MAX / 2));
1.7.0 (const: 1.52.0) · Source

Calculates the divisor when self is divided by rhs.

Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would occur. If an overflow would occur then self is returned.

§Panics

This function will panic if rhs is zero.

§Examples

Basic usage:

assert_eq!(5i128.overflowing_div(2), (2, false));
assert_eq!(i128::MIN.overflowing_div(-1), (i128::MIN, true));
1.38.0 (const: 1.52.0) · Source

Calculates the quotient of Euclidean division self.div_euclid(rhs).

Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would occur. If an overflow would occur then self is returned.

§Panics

This function will panic if rhs is zero.

§Examples

Basic usage:

assert_eq!(5i128.overflowing_div_euclid(2), (2, false));
assert_eq!(i128::MIN.overflowing_div_euclid(-1), (i128::MIN, true));
1.7.0 (const: 1.52.0) · Source

Calculates the remainder when self is divided by rhs.

Returns a tuple of the remainder after dividing along with a boolean indicating whether an arithmetic overflow would occur. If an overflow would occur then 0 is returned.

§Panics

This function will panic if rhs is zero.

§Examples

Basic usage:

assert_eq!(5i128.overflowing_rem(2), (1, false));
assert_eq!(i128::MIN.overflowing_rem(-1), (0, true));
1.38.0 (const: 1.52.0) · Source

Overflowing Euclidean remainder. Calculates self.rem_euclid(rhs).

Returns a tuple of the remainder after dividing along with a boolean indicating whether an arithmetic overflow would occur. If an overflow would occur then 0 is returned.

§Panics

This function will panic if rhs is zero.

§Examples

Basic usage:

assert_eq!(5i128.overflowing_rem_euclid(2), (1, false));
assert_eq!(i128::MIN.overflowing_rem_euclid(-1), (0, true));
1.7.0 (const: 1.32.0) · Source

Negates self, overflowing if this is equal to the minimum value.

Returns a tuple of the negated version of self along with a boolean indicating whether an overflow happened. If self is the minimum value (e.g., i32::MIN for values of type i32), then the minimum value will be returned again and true will be returned for an overflow happening.

§Examples

Basic usage:

assert_eq!(2i128.overflowing_neg(), (-2, false));
assert_eq!(i128::MIN.overflowing_neg(), (i128::MIN, true));
1.7.0 (const: 1.32.0) · Source

Shifts self left by rhs bits.

Returns a tuple of the shifted version of self along with a boolean indicating whether the shift value was larger than or equal to the number of bits. If the shift value is too large, then value is masked (N-1) where N is the number of bits, and this value is then used to perform the shift.

§Examples

Basic usage:

assert_eq!(0x1i128.overflowing_shl(4), (0x10, false));
assert_eq!(0x1i32.overflowing_shl(36), (0x10, true));
assert_eq!(0x10i128.overflowing_shl(127), (0, false));
1.7.0 (const: 1.32.0) · Source

Shifts self right by rhs bits.

Returns a tuple of the shifted version of self along with a boolean indicating whether the shift value was larger than or equal to the number of bits. If the shift value is too large, then value is masked (N-1) where N is the number of bits, and this value is then used to perform the shift.

§Examples

Basic usage:

assert_eq!(0x10i128.overflowing_shr(4), (0x1, false));
assert_eq!(0x10i32.overflowing_shr(36), (0x1, true));
1.13.0 (const: 1.32.0) · Source

Computes the absolute value of self.

Returns a tuple of the absolute version of self along with a boolean indicating whether an overflow happened. If self is the minimum value (e.g., i128::MIN for values of type i128), then the minimum value will be returned again and true will be returned for an overflow happening.

§Examples

Basic usage:

assert_eq!(10i128.overflowing_abs(), (10, false));
assert_eq!((-10i128).overflowing_abs(), (10, false));
assert_eq!((i128::MIN).overflowing_abs(), (i128::MIN, true));
1.34.0 (const: 1.50.0) · Source

Raises self to the power of exp, using exponentiation by squaring.

Returns a tuple of the exponentiation along with a bool indicating whether an overflow happened.

§Examples

Basic usage:

assert_eq!(3i128.overflowing_pow(4), (81, false));
assert_eq!(3i8.overflowing_pow(5), (-13, true));
1.0.0 (const: 1.50.0) · Source

Raises self to the power of exp, using exponentiation by squaring.

§Examples

Basic usage:

let x: i128 = 2; // or any other integer type
assert_eq!(x.pow(5), 32);
1.84.0 (const: 1.84.0) · Source

Returns the square root of the number, rounded down.

§Panics

This function will panic if self is negative.

§Examples

Basic usage:

assert_eq!(10i128.isqrt(), 3);
1.38.0 (const: 1.52.0) · Source

Calculates the quotient of Euclidean division of self by rhs.

This computes the integer q such that self = q * rhs + r, with r = self.rem_euclid(rhs) and 0 <= r < abs(rhs).

In other words, the result is self / rhs rounded to the integer q such that self >= q * rhs. If self > 0, this is equal to rounding towards zero (the default in Rust); if self < 0, this is equal to rounding away from zero (towards +/- infinity). If rhs > 0, this is equal to rounding towards -infinity; if rhs < 0, this is equal to rounding towards +infinity.

§Panics

This function will panic if rhs is zero or if self is Self::MIN and rhs is -1. This behavior is not affected by the overflow-checks flag.

§Examples

Basic usage:

let a: i128 = 7; // or any other integer type
let b = 4;
assert_eq!(a.div_euclid(b), 1); // 7 >= 4 * 1
assert_eq!(a.div_euclid(-b), -1); // 7 >= -4 * -1
assert_eq!((-a).div_euclid(b), -2); // -7 >= 4 * -2
assert_eq!((-a).div_euclid(-b), 2); // -7 >= -4 * 2
1.38.0 (const: 1.52.0) · Source

Calculates the least nonnegative remainder of self (mod rhs).

This is done as if by the Euclidean division algorithm – given r = self.rem_euclid(rhs), the result satisfies self = rhs * self.div_euclid(rhs) + r and 0 <= r < abs(rhs).

§Panics

This function will panic if rhs is zero or if self is Self::MIN and rhs is -1. This behavior is not affected by the overflow-checks flag.

§Examples

Basic usage:

let a: i128 = 7; // or any other integer type
let b = 4;
assert_eq!(a.rem_euclid(b), 3);
assert_eq!((-a).rem_euclid(b), 1);
assert_eq!(a.rem_euclid(-b), 3);
assert_eq!((-a).rem_euclid(-b), 1);

This will panic:

let _ = i128::MIN.rem_euclid(-1);
Source

🔬This is a nightly-only experimental API. (int_roundings #88581)

Calculates the quotient of self and rhs, rounding the result towards negative infinity.

§Panics

This function will panic if rhs is zero or if self is Self::MIN and rhs is -1. This behavior is not affected by the overflow-checks flag.

§Examples

Basic usage:

#![feature(int_roundings)]
let a: i128 = 8;
let b = 3;
assert_eq!(a.div_floor(b), 2);
assert_eq!(a.div_floor(-b), -3);
assert_eq!((-a).div_floor(b), -3);
assert_eq!((-a).div_floor(-b), 2);
Source

🔬This is a nightly-only experimental API. (int_roundings #88581)

Calculates the quotient of self and rhs, rounding the result towards positive infinity.

§Panics

This function will panic if rhs is zero or if self is Self::MIN and rhs is -1. This behavior is not affected by the overflow-checks flag.

§Examples

Basic usage:

#![feature(int_roundings)]
let a: i128 = 8;
let b = 3;
assert_eq!(a.div_ceil(b), 3);
assert_eq!(a.div_ceil(-b), -2);
assert_eq!((-a).div_ceil(b), -2);
assert_eq!((-a).div_ceil(-b), 3);
Source

🔬This is a nightly-only experimental API. (int_roundings #88581)

If rhs is positive, calculates the smallest value greater than or equal to self that is a multiple of rhs. If rhs is negative, calculates the largest value less than or equal to self that is a multiple of rhs.

§Panics

This function will panic if rhs is zero.

§Overflow behavior

On overflow, this function will panic if overflow checks are enabled (default in debug mode) and wrap if overflow checks are disabled (default in release mode).

§Examples

Basic usage:

#![feature(int_roundings)]
assert_eq!(16_i128.next_multiple_of(8), 16);
assert_eq!(23_i128.next_multiple_of(8), 24);
assert_eq!(16_i128.next_multiple_of(-8), 16);
assert_eq!(23_i128.next_multiple_of(-8), 16);
assert_eq!((-16_i128).next_multiple_of(8), -16);
assert_eq!((-23_i128).next_multiple_of(8), -16);
assert_eq!((-16_i128).next_multiple_of(-8), -16);
assert_eq!((-23_i128).next_multiple_of(-8), -24);
Source

🔬This is a nightly-only experimental API. (int_roundings #88581)

If rhs is positive, calculates the smallest value greater than or equal to self that is a multiple of rhs. If rhs is negative, calculates the largest value less than or equal to self that is a multiple of rhs. Returns None if rhs is zero or the operation would result in overflow.

§Examples

Basic usage:

#![feature(int_roundings)]
assert_eq!(16_i128.checked_next_multiple_of(8), Some(16));
assert_eq!(23_i128.checked_next_multiple_of(8), Some(24));
assert_eq!(16_i128.checked_next_multiple_of(-8), Some(16));
assert_eq!(23_i128.checked_next_multiple_of(-8), Some(16));
assert_eq!((-16_i128).checked_next_multiple_of(8), Some(-16));
assert_eq!((-23_i128).checked_next_multiple_of(8), Some(-16));
assert_eq!((-16_i128).checked_next_multiple_of(-8), Some(-16));
assert_eq!((-23_i128).checked_next_multiple_of(-8), Some(-24));
assert_eq!(1_i128.checked_next_multiple_of(0), None);
assert_eq!(i128::MAX.checked_next_multiple_of(2), None);
1.67.0 (const: 1.67.0) · Source

Returns the logarithm of the number with respect to an arbitrary base, rounded down.

This method might not be optimized owing to implementation details; ilog2 can produce results more efficiently for base 2, and ilog10 can produce results more efficiently for base 10.

§Panics

This function will panic if self is less than or equal to zero, or if base is less than 2.

§Examples
assert_eq!(5i128.ilog(5), 1);
1.67.0 (const: 1.67.0) · Source

Returns the base 2 logarithm of the number, rounded down.

§Panics

This function will panic if self is less than or equal to zero.

§Examples
assert_eq!(2i128.ilog2(), 1);
1.67.0 (const: 1.67.0) · Source

Returns the base 10 logarithm of the number, rounded down.

§Panics

This function will panic if self is less than or equal to zero.

§Example
assert_eq!(10i128.ilog10(), 1);
1.67.0 (const: 1.67.0) · Source

Returns the logarithm of the number with respect to an arbitrary base, rounded down.

Returns None if the number is negative or zero, or if the base is not at least 2.

This method might not be optimized owing to implementation details; checked_ilog2 can produce results more efficiently for base 2, and checked_ilog10 can produce results more efficiently for base 10.

§Examples
assert_eq!(5i128.checked_ilog(5), Some(1));
1.67.0 (const: 1.67.0) · Source

Returns the base 2 logarithm of the number, rounded down.

Returns None if the number is negative or zero.

§Examples
assert_eq!(2i128.checked_ilog2(), Some(1));
1.67.0 (const: 1.67.0) · Source

Returns the base 10 logarithm of the number, rounded down.

Returns None if the number is negative or zero.

§Example
assert_eq!(10i128.checked_ilog10(), Some(1));
1.0.0 (const: 1.32.0) · Source

Computes the absolute value of self.

§Overflow behavior

The absolute value of i128::MIN cannot be represented as an i128, and attempting to calculate it will cause an overflow. This means that code in debug mode will trigger a panic on this case and optimized code will return i128::MIN without a panic. If you do not want this behavior, consider using unsigned_abs instead.

§Examples

Basic usage:

assert_eq!(10i128.abs(), 10);
assert_eq!((-10i128).abs(), 10);
1.60.0 (const: 1.60.0) · Source

Computes the absolute difference between self and other.

This function always returns the correct answer without overflow or panics by returning an unsigned integer.

§Examples

Basic usage:

assert_eq!(100i128.abs_diff(80), 20u128);
assert_eq!(100i128.abs_diff(110), 10u128);
assert_eq!((-100i128).abs_diff(80), 180u128);
assert_eq!((-100i128).abs_diff(-120), 20u128);
assert_eq!(i128::MIN.abs_diff(i128::MAX), u128::MAX);
1.0.0 (const: 1.47.0) · Source

Returns a number representing sign of self.

  • 0 if the number is zero
  • 1 if the number is positive
  • -1 if the number is negative
§Examples

Basic usage:

assert_eq!(10i128.signum(), 1);
assert_eq!(0i128.signum(), 0);
assert_eq!((-10i128).signum(), -1);
1.0.0 (const: 1.32.0) · Source

Returns true if self is positive and false if the number is zero or negative.

§Examples

Basic usage:

assert!(10i128.is_positive());
assert!(!(-10i128).is_positive());
1.0.0 (const: 1.32.0) · Source

Returns true if self is negative and false if the number is zero or positive.

§Examples

Basic usage:

assert!((-10i128).is_negative());
assert!(!10i128.is_negative());
1.32.0 (const: 1.44.0) · Source

Returns the memory representation of this integer as a byte array in big-endian (network) byte order.

§Examples
let bytes = 0x12345678901234567890123456789012i128.to_be_bytes();
assert_eq!(bytes, [0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]);
1.32.0 (const: 1.44.0) · Source

Returns the memory representation of this integer as a byte array in little-endian byte order.

§Examples
let bytes = 0x12345678901234567890123456789012i128.to_le_bytes();
assert_eq!(bytes, [0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]);
1.32.0 (const: 1.44.0) · Source

Returns the memory representation of this integer as a byte array in native byte order.

As the target platform’s native endianness is used, portable code should use to_be_bytes or to_le_bytes, as appropriate, instead.

§Examples
let bytes = 0x12345678901234567890123456789012i128.to_ne_bytes();
assert_eq!(
    bytes,
    if cfg!(target_endian = "big") {
        [0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]
    } else {
        [0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]
    }
);
1.32.0 (const: 1.44.0) · Source

Creates an integer value from its representation as a byte array in big endian.

§Examples
let value = i128::from_be_bytes([0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]);
assert_eq!(value, 0x12345678901234567890123456789012);

When starting from a slice rather than an array, fallible conversion APIs can be used:

fn read_be_i128(input: &mut &[u8]) -> i128 {
    let (int_bytes, rest) = input.split_at(std::mem::size_of::<i128>());
    *input = rest;
    i128::from_be_bytes(int_bytes.try_into().unwrap())
}
1.32.0 (const: 1.44.0) · Source

Creates an integer value from its representation as a byte array in little endian.

§Examples
let value = i128::from_le_bytes([0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]);
assert_eq!(value, 0x12345678901234567890123456789012);

When starting from a slice rather than an array, fallible conversion APIs can be used:

fn read_le_i128(input: &mut &[u8]) -> i128 {
    let (int_bytes, rest) = input.split_at(std::mem::size_of::<i128>());
    *input = rest;
    i128::from_le_bytes(int_bytes.try_into().unwrap())
}
1.32.0 (const: 1.44.0) · Source

Creates an integer value from its memory representation as a byte array in native endianness.

As the target platform’s native endianness is used, portable code likely wants to use from_be_bytes or from_le_bytes, as appropriate instead.

§Examples
let value = i128::from_ne_bytes(if cfg!(target_endian = "big") {
    [0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]
} else {
    [0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]
});
assert_eq!(value, 0x12345678901234567890123456789012);

When starting from a slice rather than an array, fallible conversion APIs can be used:

fn read_ne_i128(input: &mut &[u8]) -> i128 {
    let (int_bytes, rest) = input.split_at(std::mem::size_of::<i128>());
    *input = rest;
    i128::from_ne_bytes(int_bytes.try_into().unwrap())
}
1.0.0 (const: 1.32.0) · Source

👎Deprecating in a future version: replaced by the MIN associated constant on this type

New code should prefer to use i128::MIN instead.

Returns the smallest value that can be represented by this integer type.

1.0.0 (const: 1.32.0) · Source

👎Deprecating in a future version: replaced by the MAX associated constant on this type

New code should prefer to use i128::MAX instead.

Returns the largest value that can be represented by this integer type.

Source

🔬This is a nightly-only experimental API. (num_midpoint_signed #110840)

Calculates the middle point of self and rhs.

midpoint(a, b) is (a + b) / 2 as if it were performed in a sufficiently-large signed integral type. This implies that the result is always rounded towards zero and that no overflow will ever occur.

§Examples
#![feature(num_midpoint_signed)]
assert_eq!(0i128.midpoint(4), 2);
assert_eq!((-1i128).midpoint(2), 0);
assert_eq!((-7i128).midpoint(0), -3);
assert_eq!(0i128.midpoint(-7), -3);
assert_eq!(0i128.midpoint(7), 3);
Source§
1.0.0 (const: 1.82.0) · Source

Converts a string slice in a given base to an integer.

The string is expected to be an optional + or - sign followed by only digits. Leading and trailing non-digit characters (including whitespace) represent an error. Underscores (which are accepted in rust literals) also represent an error.

Digits are a subset of these characters, depending on radix:

  • 0-9
  • a-z
  • A-Z
§Panics

This function panics if radix is not in the range from 2 to 36.

§Examples

Basic usage:

assert_eq!(i128::from_str_radix("A", 16), Ok(10));

Trailing space returns error:

assert!(i128::from_str_radix("1 ", 10).is_err());

§
§
§
§
§
§