Примитивный тип isize

Размерный знаковый целочисленный тип.

Размер этого примитива соответствует количеству байт, необходимых для ссылки на любое место в памяти. Например, на 32-битной цели это 4 байта, а на 64-битной — 8 байтов.

Примечание: В данной документации представлены реализации для 64-битной архитектуры. На 32-битной архитектуре значения констант и поведение методов будут отличаться.

Константы

КонстантаЗначениеВерсияОписание
MIN-9_223_372_036_854_775_8081.43.0Наименьшее значение (−2⁶³)
MAX9_223_372_036_854_775_8071.43.0Наибольшее значение (2⁶³ − 1)
BITS641.53.0Размер типа в битах

Таблицы методов

Битовая арифметика

МетодВерсияОписание
count_ones()1.0.0Количество единиц в двоичном представлении
count_zeros()1.0.0Количество нулей в двоичном представлении
leading_zeros()1.0.0Количество ведущих нулей
trailing_zeros()1.0.0Количество хвостовых нулей
leading_ones()1.46.0Количество ведущих единиц
trailing_ones()1.46.0Количество хвостовых единиц
rotate_left(n)1.0.0Циклический сдвиг влево
rotate_right(n)1.0.0Циклический сдвиг вправо
swap_bytes()1.0.0Обратный порядок байтов
reverse_bits()1.37.0Обратный порядок битов
from_be(x)1.0.0Преобразование из big-endian
from_le(x)1.0.0Преобразование из little-endian
to_be()1.0.0Преобразование в big-endian
to_le()1.0.0Преобразование в little-endian
cast_unsigned()1.87.0Преобразование битового шаблона в usize

Экспериментальные битовые методы

МетодФлагОписание
isolate_highest_one()isolate_most_least_significant_oneОставляет только старший бит
isolate_lowest_one()isolate_most_least_significant_oneОставляет только младший бит
highest_one()int_lowest_highest_oneИндекс старшего установленного бита
lowest_one()int_lowest_highest_oneИндекс младшего установленного бита
shl_exact(rhs)exact_bitshiftsТочный сдвиг влево с проверкой
shr_exact(rhs)exact_bitshiftsТочный сдвиг вправо с проверкой
div_exact(rhs)exact_divДеление без остатка
checked_div_exact(rhs)exact_divПроверенное деление без остатка

Арифметика с проверкой переполнения

МетодОперацияВерсияПоведение при переполнении
checked_add(rhs)+1.0.0Возвращает None
checked_sub(rhs)-1.0.0Возвращает None
checked_mul(rhs)*1.0.0Возвращает None
checked_div(rhs)/1.0.0Возвращает None при делении на 0 или переполнении
checked_rem(rhs)%1.7.0Возвращает None при делении на 0 или переполнении
checked_neg()-x1.7.0Возвращает None для MIN
checked_shl(rhs)<<1.7.0Возвращает None при слишком большом сдвиге
checked_shr(rhs)>>1.7.0Возвращает None при слишком большом сдвиге
checked_abs()abs()1.13.0Возвращает None для MIN
checked_pow(exp)pow()1.34.0Возвращает None при переполнении
checked_isqrt()isqrt()1.84.0Возвращает None для отрицательных чисел

Строгие методы (всегда паникуют при переполнении)

МетодВерсияПаникует при
strict_add(rhs)1.91.0Переполнении
strict_sub(rhs)1.91.0Переполнении
strict_mul(rhs)1.91.0Переполнении
strict_div(rhs)1.91.0Делении на 0 или MIN / -1
strict_rem(rhs)1.91.0Делении на 0 или MIN % -1
strict_neg()1.91.0-MIN
strict_shl(rhs)1.91.0Сдвиге ≥ BITS
strict_shr(rhs)1.91.0Сдвиге ≥ BITS
strict_abs()1.91.0abs(MIN)
strict_pow(exp)1.91.0Переполнении

Небезопасные методы (без проверок)

МетодФлагНебезопасность при
unchecked_add(rhs)-Переполнении
unchecked_sub(rhs)-Переполнении
unchecked_mul(rhs)-Переполнении
unchecked_neg()unchecked_neg-MIN
unchecked_shl(rhs)unchecked_shiftsСдвиге ≥ BITS
unchecked_shr(rhs)unchecked_shiftsСдвиге ≥ BITS
unchecked_shl_exact(rhs)exact_bitshiftsНевозможности обратить сдвиг
unchecked_shr_exact(rhs)exact_bitshiftsНевозможности обратить сдвиг
unchecked_div_exact(rhs)exact_divДелении на 0, остатке или MIN / -1

Насыщающая арифметика

МетодОперацияВерсияПоведение при переполнении
saturating_add(rhs)+1.0.0Возвращает MAX или MIN
saturating_sub(rhs)-1.0.0Возвращает MAX или MIN
saturating_mul(rhs)*1.7.0Возвращает MAX или MIN
saturating_div(rhs)/1.58.0Возвращает MAX или MIN
saturating_neg()-x1.45.0Возвращает MAX для MIN
saturating_abs()abs()1.45.0Возвращает MAX для MIN
saturating_pow(exp)pow()1.34.0Возвращает MAX или MIN

Обёртывающая арифметика

МетодОперацияВерсияПоведение при переполнении
wrapping_add(rhs)+1.0.0Обёртывание по модулю
wrapping_sub(rhs)-1.0.0Обёртывание по модулю
wrapping_mul(rhs)*1.0.0Обёртывание по модулю
wrapping_div(rhs)/1.2.0Возвращает MIN для MIN / -1
wrapping_rem(rhs)%1.2.0Возвращает 0 для MIN % -1
wrapping_neg()-x1.2.0Возвращает MIN для MIN
wrapping_shl(rhs)<<1.2.0Маскирование сдвига
wrapping_shr(rhs)>>1.2.0Маскирование сдвига
wrapping_abs()abs()1.13.0Возвращает MIN для MIN
wrapping_pow(exp)pow()1.34.0Обёртывание по модулю

Арифметика с переполнением (возвращает флаг)

МетодОперацияВерсияВозвращает
overflowing_add(rhs)+1.7.0(результат, флаг_переполнения)
overflowing_sub(rhs)-1.7.0(результат, флаг_переполнения)
overflowing_mul(rhs)*1.7.0(результат, флаг_переполнения)
overflowing_div(rhs)/1.7.0(результат, флаг_переполнения)
overflowing_rem(rhs)%1.7.0(результат, флаг_переполнения)
overflowing_neg()-x1.7.0(результат, флаг_переполнения)
overflowing_shl(rhs)<<1.7.0(результат, флаг_сдвига)
overflowing_shr(rhs)>>1.7.0(результат, флаг_сдвига)
overflowing_abs()abs()1.13.0(результат, флаг_переполнения)
overflowing_pow(exp)pow()1.34.0(результат, флаг_переполнения)

Работа с беззнаковыми числами

МетодОперацияВерсияТип аргумента
checked_add_unsigned(rhs)+1.66.0usize
checked_sub_unsigned(rhs)-1.66.0usize
strict_add_unsigned(rhs)+1.91.0usize
strict_sub_unsigned(rhs)-1.91.0usize
saturating_add_unsigned(rhs)+1.66.0usize
saturating_sub_unsigned(rhs)-1.66.0usize
wrapping_add_unsigned(rhs)+1.66.0usize
wrapping_sub_unsigned(rhs)-1.66.0usize
overflowing_add_unsigned(rhs)+1.66.0usize
overflowing_sub_unsigned(rhs)-1.66.0usize

Евклидова арифметика

МетодВерсияОписание
div_euclid(rhs)1.38.0Евклидово деление
rem_euclid(rhs)1.38.0Евклидов остаток
checked_div_euclid(rhs)1.38.0Проверенное евклидово деление
checked_rem_euclid(rhs)1.38.0Проверенный евклидов остаток
strict_div_euclid(rhs)1.91.0Строгое евклидово деление
strict_rem_euclid(rhs)1.91.0Строгий евклидов остаток
wrapping_div_euclid(rhs)1.38.0Обёртывающее евклидово деление
wrapping_rem_euclid(rhs)1.38.0Обёртывающий евклидов остаток
overflowing_div_euclid(rhs)1.38.0Евклидово деление с переполнением
overflowing_rem_euclid(rhs)1.38.0Евклидов остаток с переполнением

Устаревшие методы

МетодЗаменаВерсияСтатус
min_value()MIN1.0.0Устарел
max_value()MAX1.0.0Устарел

Математические функции

МетодОписаниеВерсия
abs()Абсолютное значение1.0.0
signum()Знак числа1.0.0
is_positive()Проверка положительности1.0.0
is_negative()Проверка отрицательности1.0.0
pow(exp)Возведение в степень1.0.0
isqrt()Целочисленный квадратный корень1.84.0
ilog(base)Логарифм по произвольному основанию1.67.0
ilog2()Двоичный логарифм1.67.0
ilog10()Десятичный логарифм1.67.0
checked_ilog(base)Проверенный логарифм1.67.0
checked_ilog2()Проверенный двоичный логарифм1.67.0
checked_ilog10()Проверенный десятичный логарифм1.67.0
unsigned_abs()Беззнаковое абсолютное значение1.51.0
abs_diff(other)Абсолютная разница1.60.0
midpoint(rhs)Средняя точка1.87.0

Округление деления

МетодФлагОписание
div_floor(rhs)int_roundingsДеление с округлением вниз
div_ceil(rhs)int_roundingsДеление с округлением вверх
next_multiple_of(rhs)int_roundingsСледующее кратное
checked_next_multiple_of(rhs)int_roundingsПроверенное следующее кратное

Расширенная арифметика (для больших чисел)

МетодФлагОписание
carrying_add(rhs, carry)bigint_helper_methodsСложение с переносом
borrowing_sub(rhs, borrow)bigint_helper_methodsВычитание с заёмом
widening_mul(rhs)bigint_helper_methodsРасширенное умножение
carrying_mul(rhs, carry)bigint_helper_methodsУмножение с переносом
carrying_mul_add(rhs, carry, add)bigint_helper_methodsУмножение с переносом и сложением

Работа с байтами

МетодПорядок байтовВерсияВозвращает
to_be_bytes()Big-endian1.32.0[u8; 8]
to_le_bytes()Little-endian1.32.0[u8; 8]
to_ne_bytes()Native1.32.0[u8; 8]
from_be_bytes(bytes)Big-endian1.32.0isize
from_le_bytes(bytes)Little-endian1.32.0isize
from_ne_bytes(bytes)Native1.32.0isize

Парсинг строк

МетодИсточникВерсия
from_str_radix(src, radix)&str1.0.0
from_ascii(src)&[u8]nightly
from_ascii_radix(src, radix)&[u8]nightly
from_str(src) (impl FromStr)&str1.0.0

Форматирование

МетодФлагОписание
format_into(buf)int_format_intoФорматирование в буфер

Специальные методы сдвига

МетодВерсияОписание
unbounded_shl(rhs)1.87.0Сдвиг влево без ограничений
unbounded_shr(rhs)1.87.0Сдвиг вправо без ограничений

Реализации трейтов

Арифметические операторы

ТрейтОперацияРеализация
Add, AddAssign+, +=Сложение
Sub, SubAssign-, -=Вычитание
Mul, MulAssign*, *=Умножение
Div, DivAssign/, /=Деление
Rem, RemAssign%, %=Остаток
Neg-xОтрицание
BitAnd, BitAndAssign&, &=Побитовое И
BitOr, BitOrAssign`,
BitXor, BitXorAssign^, ^=Побитовое XOR
Not!Побитовое НЕ
Shl, ShlAssign<<, <<=Сдвиг влево
Shr, ShrAssign>>, >>=Сдвиг вправо

Трейты форматирования

ТрейтФорматПример
DisplayДесятичный42
DebugОтладочный42
BinaryДвоичный0b101010
OctalВосьмеричный0o52
LowerHexНижний регистр hex0x2a
UpperHexВерхний регистр hex0x2A
LowerExpНаучная нотация (нижний)4.2e1
UpperExpНаучная нотация (верхний)4.2E1

Трейты преобразования

ПреобразованиеМетодОсобенности
From<bool>from(bool)0 для false, 1 для true
From<i8>from(i8)Без потерь
From<i16>from(i16)Без потерь
From<u8>from(u8)Без потерь
TryFrom<i32>try_from(i32)С проверкой диапазона
TryFrom<i64>try_from(i64)С проверкой диапазона
TryFrom<i128>try_from(i128)С проверкой диапазона
TryFrom<u16>try_from(u16)С проверкой диапазона
TryFrom<u32>try_from(u32)С проверкой диапазона
TryFrom<u64>try_from(u64)С проверкой диапазона
TryFrom<u128>try_from(u128)С проверкой диапазона
TryFrom<usize>try_from(usize)С проверкой диапазона

Прочие важные трейты

ТрейтНазначение
DefaultЗначение по умолчанию (0)
Clone, CopyКлонирование и копирование
HashХеширование
PartialOrd, OrdСравнение
PartialEq, EqРавенство
Step, TrustedStepИтерация по диапазонам
Product, SumАгрегация итераторов
FromStrПарсинг из строки

Примеры

Базовое использование

#![allow(unused)]
fn main() {
let x: isize = 42;
let y: isize = -10;

assert_eq!(x + y, 32);
assert_eq!(x.abs_diff(y), 52);
}

Проверка переполнения

#![allow(unused)]
fn main() {
assert_eq!(isize::MAX.checked_add(1), None);
assert_eq!(isize::MAX.saturating_add(1), isize::MAX);
assert_eq!(isize::MAX.wrapping_add(1), isize::MIN);
}

Работа с битами

#![allow(unused)]
fn main() {
let n: isize = 0b1010;
assert_eq!(n.count_ones(), 2);
assert_eq!(n.rotate_left(2), 0b101000);
}

Преобразование байтов

#![allow(unused)]
fn main() {
let bytes = 0x1234567890123456isize.to_be_bytes();
assert_eq!(bytes, [0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]);

let value = isize::from_be_bytes(bytes);
assert_eq!(value, 0x1234567890123456);
}

Евклидова арифметика

#![allow(unused)]
fn main() {
let a: isize = -7;
let b: isize = 4;
assert_eq!(a.div_euclid(b), -2);
assert_eq!(a.rem_euclid(b), 1);
}

Логарифмы

#![allow(unused)]
fn main() {
assert_eq!(16isize.ilog2(), 4);
assert_eq!(100isize.ilog10(), 2);
assert_eq!(125isize.ilog(5), 3);
}

Особенности

  1. Размерность: Размер isize зависит от целевой архитектуры (обычно 32 или 64 бита).
  2. Переполнение: При переполнении в отладочной сборке происходит паника, в релизной — обёртывание.
  3. Деление на ноль: Всегда вызывает панику.
  4. MIN.abs(): Вызывает панику в отладочной сборке, возвращает MIN в релизной.
  5. Эндрианность: Методы to_be_bytes(), to_le_bytes(), to_ne_bytes() учитывают порядок байтов.