Целые числа без знака в Kotlin

Типы без знака доступны только с Kotlin 1.3 и в настоящее время являются экспериментальными.

Kotlin вводит следующие типы для целых чисел без знака (unsigned integers):

  • kotlin.UByte: 8-разрядное целое число без знака, от 0 до 255
  • kotlin.UShort: 16-разрядное целое число без знака, от 0 до 65535
  • kotlin.UInt: 32-разрядное целое число без знака, от 0 до 2^32 - 1
  • kotlin.ULong: 64-разрядное целое число без знака, от 0 до 2^64 - 1

Типы без знака поддерживают большинство операций их аналогов со знаком.

Обратите внимание, что изменение типа с типа без знака на аналог со знаком (и наоборот) является двоичным несовместимым изменением.

Типы без знака реализованы с использованием другой экспериментальной функции, а именно встроенных классов (inline classes).

Специализированные классы

Так же, как и для примитивов, каждый тип без знака имеет соответствующий тип, представляющий массив, специализированный для этого типа без знака:

  • kotlin.UByteArray: массив байтов без знака
  • kotlin.UShortArray: массив коротких целых чисел (16-разрядное целое) без знака (UShort)
  • kotlin.UIntArray: массив целых чисел без знака
  • kotlin.ULongArray: массив длинных целых чисел без знака (ULong)

Как и для целочисленных массивов со знаком, они предоставляют API-интерфейс, аналогичный классу Array, без дополнительных затрат на упаковку.

Кроме того, диапазоны и прогрессии поддерживаются для UInt и ULong классами kotlin.ranges.UIntRange, kotlin.ranges.UIntProgression, kotlin.ranges.ULongRange, kotlin.ranges.ULongProgression.

Литералы целых чисел без знака

Чтобы упростить использование целых чисел без знака, Kotlin предоставляет возможность помечать целочисленный литерал суффиксом, указывающим конкретный тип без знака (аналогично Float/Long):

суффиксы u и U помечают литерал как беззнаковый. Точный тип будет определен на основе ожидаемого типа. Если ожидаемый тип не указан, будет выбран UInt или ULong в зависимости от размера литерала.

val b: UByte = 1u  // UByte, предоставлен ожидаемый тип
val s: UShort = 1u // UShort, предоставлен ожидаемый тип
val l: ULong = 1u  // ULong, предоставлен ожидаемый тип

// UInt: ожидаемый тип не предоставлен, 
// константа умещается в UInt
val a1 = 42u 

// ULong: ожидаемый тип не предоставлен, 
// константа не умещается в UInt
val a2 = 0xFFFF_FFFF_FFFFu 

суффиксы uL и UL явно помечают литерал как длинное целое число без знака (ULong).

// ULong, даже хотя ожидаемый тип не предоставлен 
// и константа умещается в UInt
val a = 1UL 

Экспериментальный статус целых чисел без знака

Дизайн типов без знака является экспериментальным, что означает, что эта функция работает быстро и никаких гарантий совместимости не дается. При использовании беззнаковой арифметики в Kotlin 1.3+ будет выдано предупреждение, указывающее, что эта функция является экспериментальной. Чтобы удалить предупреждение, вы должны подписаться на экспериментальное использование типов без знака.

Существует два возможных способа подписки на типы без знака: пометить API как экспериментальный или не делать этого.

  • Чтобы распространять экспериментальность, аннотируйте объявления, которые используют целые числа без знака, с @ExperimentalUnsignedTypes.
  • Чтобы подписаться без распространения экспериментальности, аннотируйте объявления с помощью @OptIn(ExperimentalUnsignedTypes::class) или передайте -Xopt-in=kotlin.ExperimentalUnsignedTypes компилятору.

Читайте также:


Комментарии

Популярные сообщения из этого блога

Строки в Kotlin

Наследование в Kotlin

Возврат и прыжки в Kotlin