21

I came across a situation just recently in which an unsigned integer would have been really useful (e.g. any negative value would not make sense etc.). Surprisingly, I discovered that Kotlin does not support unsigned integers - and there doesn't appear to be anything else out there about why (even though I've looked).

Am I missing something?

starbeamrainbowlabs
  • 5,692
  • 8
  • 42
  • 73

3 Answers3

32

Unsigned counterparts of Byte, Short, Int and Long do exist in Beta since Kotlin 1.3 and are stable as of Kotlin 1.5:

From the docs:

kotlin.UByte: an unsigned 8-bit integer, ranges from 0 to 255
kotlin.UShort: an unsigned 16-bit integer, ranges from 0 to 65535
kotlin.UInt: an unsigned 32-bit integer, ranges from 0 to 2^32 - 1
kotlin.ULong: an unsigned 64-bit integer, ranges from 0 to 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()
Willi Mentzel
  • 27,862
  • 20
  • 113
  • 121
8

Why does Kotlin not have native unsigned types

This is because as this question shows, Java does not have built-in unsigned types.

When used on the JVM Kotlin compiles to Java Bytecode, so this limitation on Java also applies to Kotlin.

Workarounds

You can use the utility methods of Integer and Long to operate on values as unsigned link, but this still stores the values as signed internally.

You could also write a utility class that holds a value and acts like an unsigned int type, but this may be slower than using the method above.

jrtapsell
  • 6,719
  • 1
  • 26
  • 49
  • 1
    I don't understand why the JVM dictates the functionality. If you can write the code to imitate an unsigned, then the byte code could do the same. Are you saying the code would be inefficient so the designers just didn't feel it was worth supporting it? It doesn't follow it can't be done. It might follow that it's not worth it. – Mitch Jan 29 '19 at 09:46
8

Starting from Kotlin 1.3 unsigned types are available and based on inline classes feature.

See "Unsigned integer types" section of 1.3-M1 release: https://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/

gildor
  • 1,789
  • 14
  • 19