数値を変数に代入するような場合、その数値が(データ型を指定しないで)数字だけで表されていると、その数値の大きさ(範囲)によってデータ型が決定してしまう。本稿では、数値の末尾に付加することによりデータ型を明示的に示すことができる「サフィックス」についてまとめる。
数値の大きさに基づき決定されるデータ型
以下は、数値の大きさによってデータ型が決定されるため、数値がデータ型の有効範囲をオーバー・フローして、コンパイル・エラーとなってしまう例である。
long data = 2000000000 + 2000000000;
Dim data As Long = 2000000000 + 2000000000
このコードは、「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;
Dim data As Long = 2000000000L + 2000000000L
このコードでは数値のサフィックスとして「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
- 絶対値を計算するには?
- レジストリの値のデータ型を判別するには?
- レジストリの値のデータ型を明示的に識別・設定するには?
- 文字列を数値に変換するには?
- ControlクラスのInvokeメソッドで匿名メソッドを使うには?
Copyright© Digital Advantage Corp. All Rights Reserved.