Kotlin: Number Type and Range


I summarized Kotlin basic number types and their range. In Kotlin, we can use Byte, Short, Int, Long, and UByte, UShort, UInt, ULong.

Size in Memory

Here, bit width and byte width for each number type.

Number type and bit and byte width
Type ビット数 バイト数
Byte, UByte 8 1
Short, UShort 16 2
Int, UInt 32 4
Long, ULong 64 8
Float 32 4
Double 64 8

Value Range

Here is the ranges of their values.

Number type and range
Type Min Max
Byte – 27 27 – 1
– 128 127
UByte 0 28 – 1
255
Short – 215 215 – 1
– 32768 32767
UShort 0 216 – 1
65535
Int – 231 231 – 1
– 2147483648 2147483647
UInt 0 232 – 1
4294967295
Long – 263 263 – 1
-9223372036854775808 9223372036854775807
ULong 0 264 – 1
18446744073709551615
Float – 3.4028235 x 1038 3.4028235 x 1038
Double – 1.7976931348623157 x 10308 1.7976931348623157 x 10308

Zeal number can take 2(bit width) numbers. Float, Double are calculated as below.

Float, Double Expression in Memory

Float, Double is separated into 3 part, sign part, exponent part, and fraction part in memory. The bit width of them are as follows.

Bit width of Sign, Exponent and Fraction parts
Sign Exponent Fraction
Float 1 8 23
Double 11 54

The value is expressed with the 3 values. Exponent value can be less than 0.

Now, denote the 3 parts as follows.

Notation
\(s\) Sign part value (0 or 1)
\(e_b\) Bit width of exponent part (8 for Float, 11 for Double)
\(e\) Exponent value in binary expression (from 0 to \(2^{e_b} – 1\))
\(f_b\) Bit width of fraction part (23 for Float, 54 for Double)
\(f\) Fraction value in binary expression (from 0 to \(2^{f_b} – 1\))

Then, the value of Float or Double can be written as follows.

\[ (-1)^s \times 2 ^ { e – 2 ^ { e_b – 1 } } \times \left( 1 + \frac{f}{2^ {\left( f_b + 1 \right)} } \right) \]

The value is the maximum when \(s=0,e=2^{e_b}-1,f=2^{f_b}-1\).

Here are some examples of sign, exponent and fraction parts in Float.

Sign
Exponent
Fraction
0.125 0
01111100
00000000000000000000000
0.25 0
01111101
00000000000000000000000
0.5 0
01111110
00000000000000000000000
1 0
01111111
00000000000000000000000
2 0
10000000
00000000000000000000000
3 0
10000000
10000000000000000000000
4 0
10000001
00000000000000000000000
5 0
10000001
01000000000000000000000
6 0
10000001
10000000000000000000000

You can easily see binary expression of the value with toBits method, which I introduced in Kotlin 1.2 New Feature.