Spec-Zone.ru › Kotlin 1.7

Типы целых беззнаковых чисел

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

  • UByte: беззнаковое 8-битное целое число, диапазон от 0 до 255

  • UShort: беззнаковое 16-битное целое число, диапазон от 0 до 65535

  • UInt: беззнаковое 32-битное целое число, диапазон от 0 до 232 - 1

  • ULong: беззнаковое 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 для пустого списка.

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

Последнее изменение: 10 августа 2022 г.
Массивы Проверка и преобразование типов

© 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

Spec-Zone.ru

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