Типы целых беззнаковых чисел
В дополнение к целочисленным типам, Kotlin предоставляет следующие типы для беззнаковых целых чисел:
UByte: беззнаковое 8-битное целое число, диапазон от 0 до 255UShort: беззнаковое 16-битное целое число, диапазон от 0 до 65535UInt: беззнаковое 32-битное целое число, диапазон от 0 до 232 - 1ULong: беззнаковое 64-битное целое число, диапазон от 0 до 264 - 1
Беззнаковые типы поддерживают большинство операций своих знаковых аналогов.
Беззнаковые массивы и диапазоны
Так же, как и для примитивов, для каждого беззнакового типа существует соответствующий тип, представляющий массивы этого типа:
UByteArray: массив беззнаковых байтовUShortArray: массив беззнаковых словUIntArray: массив беззнаковых целых чиселULongArray: массив беззнаковых длинных целых чисел
Так же, как и для знакомых целочисленных массивов, они предоставляют аналогичный API к классу Array без расходов на упаковку.
При использовании беззнаковых массивов вы получите предупреждение, указывающее на то, что эта функция пока не стабильна. Чтобы удалить предупреждение, включите аннотацию @ExperimentalUnsignedTypes. Решать вам, должны ли ваши клиенты явно включать использование вашего API, но помните, что беззнаковые массивы не являются стабильной функцией, поэтому API, использующий их, может быть сломан из-за изменений в языке. Узнайте больше о требованиях к включению.
Диапазоны и прогрессии поддерживаются для UInt и ULong классами 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–2022 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