数値のデータ型

Go言語 (golang)

数値の型は以下がある。

uint8
1バイトの符号なし整数。
byte
uint8 のエイリアス。
uint16
2バイトの符号なし整数。
uint32
4バイトの符号なし整数。
uint64
8バイトの符号なし整数。
uint
実装によって4バイトまたは8バイトとなりうる符号なし整数。
int8
1バイトの符号付き整数。
int16
2バイトの符号付き整数。
int32
4バイトの符号付き整数。
rune
int32 のエイリアス。
int64
8バイトの符号付き整数。
int
実装によって4バイトまたは8バイトとなりうる符号付き整数。
float32
IEEE 754 の32ビット単精度の浮動小数点数。
float64
IEEE 754 の64ビット単精度の浮動小数点数。
complex64
2つの float32 で表される複素数。
complex128
2つの float64 で表される複素数。

Java

数値となるプリミティブ型には、 char, byte, short, int, long, float, double があり、それぞれに対応するオブジェクトのクラスもある。対応するクラスというのは、プリミティブ型とは別の型で、プリミティブ型をオブジェクトにラップしているクラスであり、プリミティブ型と対応するクラスはboxing/unboxingによて相互に変換できる。

char
1バイトの符号なし整数。文字の表現に使われる。対応するクラスは java.lang.Character
byte
1バイトの符号付き整数。対応するクラスは java.lang.Byte
short
2バイトの符号付き整数。対応するクラスは java.lang.Short
int
4バイトの符号付き整数。対応するクラスは java.lang.Integer
long
8バイトの符号付き整数。対応するクラスは java.lang.Long
float
IEEE 754 の32ビット単精度の浮動小数点数。対応するクラスは java.lang.Float
double
IEEE 754 の64ビット倍精度の浮動小数点数。対応するクラスは java.lang.Double

Javaのプリミティブ型としては上記の他に boolean がある。

C言語のunsignedに相当する符号なしの整数型はない。

-> 数値リテラルの書き方

Scala

Javaのプリミティブ型それぞれに対応したScalaのクラスがある。名前は先頭を大文字にしただけである。 Javaのjava.lang.Integerintは別物だが、Scalaのscala.IntはJavaのintと同一視できる。

scala.Char
Javaのchar
scala.Short
Javaのshort
scala.Int
Javaのint
scala.Long
Javaのlong
scala.Float
Javaのfloat
scala.Double
Javaのdouble

Scalaではこれらをプリミティブ型であると意識しないといけないケースは少ない。

コンパイル後のJVM上ではJavaのプリミティブ型に変換されているので、パフォーマンスの心配はしなくてよい。けど、オートボクシングの処理が挟まるケースもある。 scala.Intなどにはメソッドがあるが、JVM上ではプリミティブ型にメソッドがあるわけではない。

PHP

整数と浮動小数点数のデータ型がある。

整数は符号付きで、32ビットなのか64ビットなのかは、プラットフォームによる。

整数は、10進数表記のほか、 0xまたは0Xで始まる16進数表記、0で始まる8進数表記、 0bまたは0Bで始まる2進数表記を使える。 2進数表記はPHP 5.4.0からなので、5.3以前では使えない。リテラルが整数の範囲を超える場合は自動で浮動小数点数になる。

整数型/浮動小数点数型の区別を動的に行うには、is_int, is_float 関数を使うとよい。

-> 型を動的に判定するには

Python

Python2では、整数(int)、長整数(long)、浮動小数点数(float)、複素数(complex)の4種類のデータ型がある。 Python3では、整数と長整数の区別がなくなり、整数(int)、浮動小数点数(float)、複素数(complex)の3種類のクラスがある。

Python2の整数は64ビットの処理系であれば、2 ** 63 - 1sys.maxint を参照することで調べることができる。この最大値を超える整数は自動で長整数になる。 Python3の整数には上限がない。 Python3で sys.maxint を参照しようとすると SyntaxError になる。

浮動小数点数はC言語でいうdoubleに相当する。

複素数は実部と虚部がそれぞれC言語のdoubleで実装されている。

整数・長整数は、10進数での表記のほか、 0xまたは0Xで始まる16進数表記、0bまたは0Bで始まる2進数表記を使える。 C言語やJavaなどと違って、8進数表記は0oまたは0Oで始める。 Python2ではC言語やJavaなどのように8進数表記として0で始めることもできるが、 Python3ではこれは SyntaxError になる。

Python2で長整数であることを明示するには数字の最後に L を付けるが、付けなくても大きな数字であれば勝手に長整数になる。 Python3で L を付けると SyntaxError になる。

整数と浮動小数点数の混ざった四則演算をするとPython2でもPython3でも結果は浮動小数点数になる。

数値リテラル | Python 2.7 documentation
http://docs.python.jp/2/reference/lexical_analysis.html#numbers

数値リテラル | Python 3 documentation
http://docs.python.jp/3/reference/lexical_analysis.html#numbers

Ruby

整数は FixnumBignum というクラスがあるが、普段はそれらのスーパークラスである Integer として認識すればよい。小さい整数は Fixnum になり、大きすぎてオーバーフローしてしまう場合は自動で Bignum になる。

a = 3
p a.class
# => Fixnum
p a.class.superclass
# => Integer
p a.class.superclass.superclass
# => Numeric

b = 300000000000000000000000000000000
p b.class
# => Bignum
p b.class.superclass
# => Integer
p b.class.superclass.superclass
# => Numeric

整数リテラルは、10進数での表記のほか、 0で始まる8進数表記、0xまたは0Xで始まる16進数表記、 0bまたは0Bで始まる2進数表記を使える。 C言語やJavaなどと違って、Pythonと同様に、 8進数表記は0oまたは0Oで始めることもできる。

整数は3ケタごとの区切りなどとして途中にアンダースコアを入れることができる。入れる場所はどこでもよく、インタプリタは単に途中のアンダースコアを無視する。ただし、0x などの直後にアンダースコアを置くことはできない。さらなる例外として、なぜか8進数表記は 0_ で始めることもできる。

浮動小数点数は、倍精度で扱える。

f = 3.14
p f.class
# => Float
p f.class.superclass
# => Numeric

それ以外に BigDecimal という金融・関係分野で使える任意精度の浮動小数点数もある。

Ruby 2.1からはrサフィックスを使った有理数(Rational型)や、 iサフィックスを使った複素数(Complex型)を書くこともできる。

Integer/Floatの区別を動的に行うには、メソッド is_a? を使うとよい。

-> クラスを動的に判定するには

Perl

数値と文字列はほとんど区別がない。数値が前提の演算子に対しては数値になるし、文字列が前提の演算子に対しては文字列になる。なので、例えばJSONに吐き出すときに、数字のつもりだった部分が文字列として吐き出されてしまうことがあるので注意。

整数と浮動小数点数の区別もない。

ソースコードの中で整数リテラルを書くときに、 3ケタごとの区切りなどとして途中にアンダースコアを入れることができる。入れる場所はどこでもよく、インタプリタ単に途中のアンダースコアを無視する。

sh (シェルスクリプト)

変数に入れる値やコマンドに渡すパラメータなどはすべて文字列で、数値も文字列で表され、区別がない。 exprコマンドにパラメータで渡せば数値として計算されるかもしれない。

JavaScript

整数型はなく、すべての数値は64bitの浮動小数点数で表される。したがって、整数が正確に表現できるのは53bit(符号を含めれば54bit)まで。

ビット演算子は、浮動小数点を32bitの符号付き整数にしてから演算し、再び浮動小数点数に変換している。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク