Spec-Zone.ru › Kotlin 2

Беззнаковые целочисленные типы

Помимо целочисленных типов, Kotlin предоставляет следующие типы для беззнаковых целых чисел:

Тип

Размер (в битах)

Минимальное значение

Максимальное значение

UByte

8

0

255

UShort

16

0

65,535

UInt

32

0

4,294,967,295 (232 - 1)

ULong

64

0

18,446,744,073,709,551,615 (264 - 1)

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

Беззнаковые числа реализованы как встраиваемые классы с одним свойством хранения, содержащим соответствующий знаковый тип той же разрядности. Если вы хотите преобразовывать беззнаковые и знаковые целочисленные типы друг в друга, убедитесь, что обновили код и вызовы функций и операции поддерживают новый тип.

Беззнаковые массивы и диапазоны

Беззнаковые массивы и операции над ними находятся в статусе бета-версии. В любой момент они могут быть изменены несовместимым образом. Требуется явное согласие на использование (подробности приведены ниже).

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

  • UByteArray: массив беззнаковых байтов.

  • UShortArray: массив беззнаковых коротких целых чисел.

  • UIntArray: массив беззнаковых целых чисел.

  • ULongArray: массив беззнаковых длинных целых чисел.

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

При использовании беззнаковых массивов появляется предупреждение о том, что эта возможность пока нестабильна. Чтобы убрать предупреждение, используйте аннотацию @ExperimentalUnsignedTypes. Вы можете сами решить, должны ли клиенты явно давать согласие на использование вашего API, но помните, что беззнаковые массивы — нестабильная возможность, поэтому изменения в языке могут нарушить API, использующий их. Подробнее о требованиях к явному согласию.

Диапазоны и прогрессии поддерживаются для UInt и ULong классами UIntRange, UIntProgression, ULongRange и ULongProgression. Вместе с беззнаковыми целочисленными типами эти классы имеют стабильный статус.

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

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

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

    val b: UByte = 1u  // UByte, expected type provided
    val s: UShort = 1u // UShort, expected type provided
    val l: ULong = 1u  // ULong, expected type provided
    
    val a1 = 42u // UInt: no expected type provided, constant fits in UInt
    val a2 = 0xFFFF_FFFF_FFFFu // ULong: no expected type provided, constant doesn't fit in UInt
    
  • uL и UL явно указывают, что литерал должен иметь тип беззнакового длинного целого числа:

    val a = 1UL // ULong, even though no expected type provided and the constant fits into UInt
    

Варианты использования

Основной вариант использования беззнаковых чисел — задействовать весь диапазон битов целого числа для представления положительных значений.
Например, для представления шестнадцатеричных констант, не помещающихся в знаковые типы, таких как цвет в 32-битном формате AARRGGBB:

data class Color(val representation: UInt)

val yellow = Color(0xFFCC00CCu)

Беззнаковые числа можно использовать для инициализации массивов байтов без явных приведений литералов toByte():

val byteOrderMarkUtf8 = ubyteArrayOf(0xEFu, 0xBBu, 0xBFu)

Еще один вариант использования — взаимодействие с нативными API. Kotlin позволяет представлять нативные объявления, в сигнатуре которых используются беззнаковые типы. При таком сопоставлении беззнаковые целые числа не заменяются знаковыми, поэтому семантика сохраняется.

Что не является целью

Хотя беззнаковые целые числа могут представлять только положительные числа и ноль, их не предполагается использовать там, где предметная область приложения требует неотрицательных целых чисел. Например, в качестве типа размера коллекции или значения индекса элемента коллекции.

На это есть несколько причин:

  • Использование знаковых целых чисел помогает обнаруживать случайные переполнения и сигнализировать об ошибочных состояниях, например когда List.lastIndex равно -1 для пустого списка.

  • Беззнаковые целые числа нельзя считать версией знаковых чисел с ограниченным диапазоном, поскольку их диапазон значений не является подмножеством диапазона знаковых целых чисел. Ни знаковые, ни беззнаковые целые числа не являются подтипами друг друга.

12 августа 2026 г.
ЧислаЛогические значения

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/unsigned-integer-types.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API