Spec-Zone.ru › Kotlin 1.8

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

В дополнение к типам целых чисел, 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 явно помечают литерал как беззнаковое длинное целое число:

    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 января 2023
Массивы Проверки и преобразования типов

© 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

Spec-Zone.ru

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