Kotlin: 数値型とその範囲


Kotlin で使える基本の数値型の範囲についてまとめました。 Kotlin では数値型として Byte, Short, Int, Long が使えます。 それに加えて UByte, UShort, UInt, ULong も使えます。

メモリ上のサイズ

プログラム内で使用するビット・バイト数は次の通りです。

数値型と使用するビット・バイト数
ビット数 バイト数
Byte, UByte 8 1
Short, UShort 16 2
Int, UInt 32 4
Long, ULong 64 8
Float 32 4
Double 64 8

値の範囲

そして、これらの型が取りうる値の範囲は次の通りです。

数値型とその範囲
最小値 最大値
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

整数型は \( 2 ^ \textrm{ビット数} \) の数だけ値を取ることができます。 Float, Double はそれぞれ次のように計算されます。

Float, Double のメモリ内の表現方法

Float, Double はメモリ内では符号部(sign)、指数部(exponent)、仮数部(fraction)に別れて表現されており、それぞれのビット数は次のようになっています。

符号部・指数部・仮数部のビット数
符号部 指数部 仮数部
Float 1 8 23
Double 11 54

これらの符号部、指数部、仮数部を用いて表現されるのですが、指数部はマイナスの値も取りうるということに注意してください。

符号部, 指数部, 仮数部について次のように記号を定めます。

\(s\) 2進数で表現したときの符号部の値 (0 または 1)
\(e_b\) 指数部のビット数 (Float なら 8, Double なら 11)
\(e\) 2進数で表現したときの0から始まる指数部の値 (0以上 (\(2^{e_b} – 1\))以下)
\(f_b\) 仮数部のビット数 (Float なら 23, Double なら 54)
\(f\) 2進数で表現したときの0から始まる仮数部の値 (0以上 (\(2^{f_b} – 1\))以下)

このようにすると、 Float, Double の値は次のように表現されます。

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

\(s=0,e=2^{e_b}-1,f=2^{f_b}-1\)のときに最大値になります。

Float での、符号部、指数部、仮数部の値の例を紹介します。

符号部
指数部
仮数部
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

Kotlin 1.2 の新機能 で紹介している toBits メソッド を使うと、 数値をビット列に簡単に変換できます。