web-dev-qa-db-fra.com

Pourquoi Kotlin ne supporte-t-il pas les entiers non signés?

Je suis récemment tombé sur une situation dans laquelle un entier non signé aurait été vraiment utile (par exemple, toute valeur négative n'aurait pas de sens, etc.). Étonnamment, j'ai découvert que Kotlin ne prend pas en charge les entiers non signés - et il ne semble pas y avoir d'autre raison de savoir pourquoi (même si j'ai jeté un œil).

Est-ce que je manque quelque chose?

6

Pourquoi Kotlin n'a-t-il pas de types natifs non signés?

En effet, comme l'indique this question, Java ne comporte pas de types non signés intégrés.

Lorsqu'il est utilisé sur la machine virtuelle Java, Kotlin compile en Java Bytecode, cette limitation sur Java s'applique donc également à Kotlin.

Solutions de contournement

Vous pouvez utiliser les méthodes utilitaires de Integer et Long pour opérer sur des valeurs telles que unsigned link , mais les valeurs sont toujours stockées comme signées en interne.

Vous pouvez également écrire une classe d’utilitaire qui contient une valeur et agit comme un type unsigned int, mais cela peut être plus lent que l’utilisation de la méthode ci-dessus.

5
jrtapsell

À partir de Kotlin 1.3, les types non signés sont disponibles et basés sur la fonctionnalité de classes en ligne. 

Voir la section "Types d'entiers non signés" de la version 1.3-M1: https://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/

2
gildor

En tant que glidor correctement mentionné, des équivalents non signés de Byte, Short, Int et Long existent depuis Kotlin 1.3 mais attention, ils sont toujoursexperimental :

De la docs :

kotlin.UByte: un entier non signé de 8 bits, compris entre 0 et 255
kotlin.UShort: un entier non signé de 16 bits, compris entre 0 et 65535
kotlin.UInt: un entier non signé de 32 bits, compris entre 0 et 2 ^ 32 - 1
kotlin.ULong: un entier non signé de 64 bits, compris entre 0 et 2 ^ 64 - 1

Usage

// You can define unsigned types using literal suffixes
val uint = 42u 

// You can convert signed types to unsigned and vice versa via stdlib extensions:
val int = uint.toInt()
val uint = int.toUInt()
1
Willi Mentzel