|
.NET TIPS 数値のデータ型を明示的に指定するには?デジタルアドバンテージ2004/05/07 |
![]() |
|
|
|
数値を変数に代入するような場合、その数値が(データ型を指定しないで)数字だけで表されていると、その数値の大きさ(範囲)によってデータ型が決定してしまう。本稿では、数値の末尾に付加することによりデータ型を明示的に示すことができる「サフィックス」についてまとめる。
数値の大きさに基づき決定されるデータ型
以下は、数値の大きさによってデータ型が決定されるため、数値がデータ型の有効範囲をオーバー・フローして、コンパイル・エラーとなってしまう例である。
|
|
| 数値の大きさによってデータ型が決定される例(C#) |
|
|
| 数値の大きさによってデータ型が決定される例(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型)となる。
数値に対する明示的なデータ型の指定
以上のように、コンパイラによって暗黙的にデータ型が決定されるのではなく、開発者が明示的にデータ型を指定するには、数値の末尾にデータ型を示す文字列(「サフィックス」と呼ばれる)を追加すればよい。
以下は先ほどの例にサフィックスを付加して、明示的に数値のデータ型を指定した例だ。これにより、データ型の有効範囲のオーバー・フローによるコンパイル・エラーを解消することができる。
|
|
| データ型を明示的に指定した定数値の例(C#) |
|
|
| データ型を明示的に指定した定数値の例(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」 |
TechTargetジャパン
- Kinectが切り開く“夢の近未来” (2012/2/2)
日本を含めた世界中でKinect for Windowsセンサー商用版とSDK正式版がリリース。未来のコンピューティングはどう変化するのか? - 3つの視点でネイティブと.NETの適材適所を考察 (2012/1/31)
アプリ開発は「ネイティブ」と「.NET」、どちらが最良? その問いには「適材適所」と答えるしかない。では、“適所”は一体どこかを考察する - SQL Azure Data Sync入門 (2012/1/30)
SQL Azure/SQL Serverデータベース間のデータ同期を簡単に実現するサービスとは? その仕組みや使用手順を解説 - Windows Phoneアプリ市場の現状を分析する (2012/1/27)
Windows Phone のアプリ・ストアに日々登録されている多種多様なアプリ。カテゴリ別のアプリ数は? 市場の現状を明らかにする
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


