Типы целых чисел без знака
В дополнение к типам целых чисел, Kotlin предоставляет следующие типы для целых чисел без знака:
UByte: целое число без знака 8 бит, значения от 0 до 255UShort: целое число без знака 16 бит, значения от 0 до 65535UInt: целое число без знака 32 бит, значения от 0 до 232 - 1ULong: целое число без знака 64 бит, значения от 0 до 264 - 1
Типы без знака поддерживают большинство операций своих знаковых аналогов.
Массивы и диапазоны целых чисел без знака
Так же, как и для примитивов, для каждого типа целого числа без знака существует соответствующий тип, представляющий массивы этого типа:
UByteArray: массив беззнаковых байтовUShortArray: массив беззнаковых shortUIntArray: массив беззнаковых intULongArray: массив беззнаковых long
Так же, как и для массивов знаковых целых чисел, они предоставляют аналогичный API к классу Array без накладных расходов на автоупаковку.
При использовании массивов целых чисел без знака вы получите предупреждение, указывающее на то, что эта функция ещё не стабильна. Чтобы устранить предупреждение, используйте аннотацию @ExperimentalUnsignedTypes. Решать вам, должны ли ваши клиенты явно включать использование вашего API, но помните, что массивы целых чисел без знака не являются стабильной функцией, поэтому API, использующий их, может быть нарушен изменениями в языке. Узнайте больше о требованиях к опциональной подписке.
Диапазоны и прогрессии для целых чисел без знака поддерживаются классами UIntRange, UIntProgression, ULongRange, и ULongProgression. Вместе с типами целых чисел без знака эти классы стабильны.
Литералы целых чисел без знака
Чтобы сделать целые числа без знака проще в использовании, Kotlin предоставляет возможность пометить целочисленный литерал суффиксом, указывающим конкретный тип без знака (аналогично Float или 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явно помечают литерал как беззнаковый long:val a = 1UL // ULong, even though no expected type provided and 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–2023 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