Беззнаковые целочисленные типы
Помимо целочисленных типов, Kotlin предоставляет следующие типы для беззнаковых целых чисел:
Тип |
Размер (в битах) |
Минимальное значение |
Максимальное значение |
|---|---|---|---|
|
8 |
0 |
255 |
|
16 |
0 |
65,535 |
|
32 |
0 |
4,294,967,295 (232 - 1) |
|
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 для пустого списка.Беззнаковые целые числа нельзя считать версией знаковых чисел с ограниченным диапазоном, поскольку их диапазон значений не является подмножеством диапазона знаковых целых чисел. Ни знаковые, ни беззнаковые целые числа не являются подтипами друг друга.
© 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