数値のデータ型を明示的に指定するには?.NET TIPS

» 2004年05月07日 05時00分 公開
[一色政彦デジタルアドバンテージ]
.NET TIPS
Insider.NET


「.NET TIPS」のインデックス

連載目次

 数値を変数に代入するような場合、その数値が(データ型を指定しないで)数字だけで表されていると、その数値の大きさ(範囲)によってデータ型が決定してしまう。本稿では、数値の末尾に付加することによりデータ型を明示的に示すことができる「サフィックス」についてまとめる。

数値の大きさに基づき決定されるデータ型

 以下は、数値の大きさによってデータ型が決定されるため、数値がデータ型の有効範囲をオーバー・フローして、コンパイル・エラーとなってしまう例である。

long data = 2000000000 + 2000000000;

数値の大きさによってデータ型が決定される例(C#)

Dim data As Long = 2000000000 + 2000000000

数値の大きさによってデータ型が決定される例(VB.NET)

 このコードは、「2000000000」という値がSystem.Int64型(C#ではlong型、VB.NETではLong型として記述可)の値として処理されることを想定して、「2000000000 + 2000000000」という演算を行っているが、実際にはコンパイラは「2000000000」をSystem.Int32型(C#:int型、VB.NET:Integer型)の値として処理する。このため、最終的な値である「4000000000」もSystem.Int32型として処理しようとし、結果的にSystem.Int32型の「-2147483648 〜 2147483647」という有効範囲をオーバー・フローしてしまうことになる(これはコンパイル時にエラーとなる)。このようになってしまう理由は、コンパイラが「2000000000」という数値の大きさによってデータ型を決定するためだ。

 このようにコンパイラが決定する「数値の有効範囲とデータ型の関係」を以下の表にまとめた。なお、この表では整数値のみを扱っている。

数値の有効範囲 データ型
-9223372036854775809 コンパイル・エラー
-9223372036854775808 -2147483649 long型(System.Int64型)
-2147483648 2147483647 int型(System.Int32型)
2147483648 4294967295 uint型(System.UInt32型)
4294967296 9223372036854775807 long型(System.Int64型)
9223372036854775808 18446744073709551615 ulong型(System.UInt64型)
18446744073709551616 コンパイル・エラー
C#における数値の有効範囲とデータ型の関係
符号付き32bit整数は-2147483648〜2147483647(0x7FFFFFFF)、符号なし32bit整数は、0〜4294967295(0xFFFFFFFF)、符号付き64bit整数は、-9223372036854775808〜9223372036854775807(0x7FFFFFFFFFFFFFFF)、符号なし64bit整数は、0〜18446744073709551615(0xFFFFFFFFFFFFFFFF)という範囲になる。
C#で、数字を16進数で表すには数値の先頭に「0x」という文字列を付加する。このように先頭に付加する文字列は「プレフィックス」と呼ばれる。
なお、符号付き32bit整数の最小値「-2147483648」を16進数で表記すると「-0x80000000」となり、符号付き64bit整数の最小値は「-9223372036854775808」と「-0x8000000000000000」となるが、C#のコンパイラはこの16進数表記のデータ型を正しく処理しない。これは「0x80000000」や「0x8000000000000000」をいったん処理した上で、「-(マイナス)」が処理されるためだと推測される。よって16進数表記では1少ない「-0x7FFFFFFF」や「-0x7FFFFFFFFFFFFFFF」までしか表現できず、「-0x80000000」や「-0x8000000000000000」は10進数で表記するか、もしくはSystem.Int32.MinValueプロパティやSystem.Int64.MinValueプロパティを使用するしかない。

数値の有効範囲 データ型
-9223372036854775808 コンパイル・エラー
-9223372036854775807 -2147483648 Long型(System.Int64型)
-2147483647 2147483647 Integer型(System.Int32型)
2147483648 9223372036854775807 Long型(System.Int64型)
9223372036854775808 コンパイル・エラー
VB.NETにおける数値の有効範囲とデータ型の関係
符号付き32bit整数は、-2147483648〜2147483647(0x&H7FFFFFFF)、符号付き64bit整数は、-9223372036854775808〜9223372036854775807(&H7FFFFFFFFFFFFFFF)という数値範囲になる。
VB.NETで、数字を16進数で表すには先頭に「&H」を付加する。この先頭に付加する文字列は「プレフィックス」と呼ばれる。ちなみにプレフィックスとして「&O」を付加すると8進数になる。
なお、符号付き32bit整数の最小値は「-2147483648」、また符号付き64bit整数の最小値は「-9223372036854775808」であるにもかかわらず、表中の数値の有効範囲が1少ない「-2147483647」や「-9223372036854775807」となっているのは、VB.NETのコンパイラが「-2147483648」や「-9223372036854775808」のデータ型を正しく処理しないためである。その理由は、「2147483648」や「9223372036854775808」をいったん処理した上で、「-(マイナス)」が処理されるためだと推測される。つまり、VB.NETでは「-2147483648」や「-9223372036854775808」の数値を正しいデータ型で処理することはできない。これらの最小値を指定するには、System.Int32.MinValueプロパティやSystem.Int64.MinValueプロパティを使用しなければならない。

 なお、整数値以外の実数値(例えば、「1.0」)のデータ型は、System.Double型(C#:double型、VB.NET:Double型)となる。

数値に対する明示的なデータ型の指定

 以上のように、コンパイラによって暗黙的にデータ型が決定されるのではなく、開発者が明示的にデータ型を指定するには、数値の末尾にデータ型を示す文字列(「サフィックス」と呼ばれる)を追加すればよい。

 以下は先ほどの例にサフィックスを付加して、明示的に数値のデータ型を指定した例だ。これにより、データ型の有効範囲のオーバー・フローによるコンパイル・エラーを解消することができる。

long data = 2000000000L + 2000000000L;

データ型を明示的に指定した定数値の例(C#)

Dim data As Long = 2000000000L + 2000000000L

データ型を明示的に指定した定数値の例(VB.NET)

 このコードでは数値のサフィックスとして「L」を付加しているため、System.Int64型(C#:long型、VB.NET:Long型)の値として扱われ、データ型の有効範囲をオーバー・フローしないので、コンパイル・エラーとはならない。

 このような「データ型を明示するためのサフィックスの一覧」を以下の表にまとめた。

データ型 サフィックス 数値の有効範囲
int型(System.Int32型) なし 符号付き32bit整数値。-2147483648 〜 2147483647
uint型(System.UInt32型) u(もしくは、U) 符号なし32bit整数値。0 〜 4294967295
long型(System.Int64型) L(もしくは、l) 符号付き64bit整数値。-9223372036854775808 〜 9223372036854775807
ulong型(System.UInt64型) ul(もしくは、UL、Ul、uL、LU、Lu、lU、lu) 符号付き64bit整数値。0 〜 18446744073709551615
decimal型(System.Decimal型) m(もしくは、M) 96bit10進値。-79228162514264337593543950335 〜 79228162514264337593543950335
float型(System.Single型) f(もしくは、F) 単精度(32bit)浮動小数点数値。-3.402823e38 〜 3.402823e38
double型(System.Double型) d(もしくは、D) 倍精度(64bit)浮動小数点数値。-1.79769313486232e308 〜 1.79769313486232e308
C#におけるデータ型を明示するためのサフィックスの一覧
long型のサフィックスは小文字の「l」で書くと「1」と間違いやすいので、大文字の「L」で書くのが一般的である。ほかのサフィックスについては小文字で書くのが一般的である。
表中の3.4028234e38とは「3.4028234掛ける10の38乗」という意味である。
なお、サフィックスの場合も前述(「C#における数値の有効範囲とデータ型の関係」)と同じ理由で「-0x8000000000000000L」は正しく処理されず、コンパイル・エラーとなる。

データ型 サフィックス 数値の有効範囲
Short型(System.Int16型) S 符号付き16bit整数値。-32767 〜 32767
Integer型(System.Int32型) I(もしくは、%) 符号なし32bit整数値。-2147483647 〜 2147483647
Long型(System.Int64型) L(もしくは、&) 符号付き64bit整数値。-9223372036854775807 〜 9223372036854775807
Decimal型(System.Decimal型) D(もしくは、@) 96bit10進値。-79228162514264337593543950335 〜 79228162514264337593543950335
Single型(System.Single型) F(もしくは、!) 単精度(32bit)浮動小数点数値。-3.402823e38 〜 3.402823e38
Double型(System.Double型) R(もしくは、#) 倍精度(64bit)浮動小数点数値。-1.79769313486232e308 〜 1.79769313486232e308
VB.NETにおけるデータ型を明示するためのサフィックスの一覧
符号付き16bit整数は、-32768 〜 32767(&H7FFF)という数値範囲になる。
表中の3.4028234e38とは「3.4028234掛ける10の38乗」という意味である。
なお、サフィックスの場合も前述(「VB.NETにおける数値の有効範囲とデータ型の関係」)と同じ理由で「-32768S」「-2147483648I」「-9223372036854775808L」は正しく処理されず、コンパイル・エラーとなる。

 なお、サフィックスを付けていても、数値がサフィックスの示すデータ型の有効範囲外である場合には、当然、コンパイル・エラーとなる。

カテゴリ:Visual Basic .NET 処理対象:データ型
カテゴリ:C# 処理対象:データ型


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。