添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

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

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

long data = 2000000000 + 2000000000;

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

このコードは、「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」という数値の大きさによってデータ型を決定するためだ。

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

コンパイル・エラー 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プロパティを使用するしかない。 コンパイル・エラー 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#)

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

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

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」は正しく処理されず、コンパイル・エラーとなる。 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メソッドで匿名メソッドを使うには?
  •