VB8(VB2005)以降では符号なし整数型を使うことができます。 ULong
は64ビット、UInteger
は32ビット、UShort
は16ビットの符号なし整数です。 VB7以前から存在した8ビットの符号なし整数Byte
も引き続き使えます。
ULong・UInteger・UShort
符号付き整数型のLong
・Integer
・Short
に対応する符号なし(Unsigned)整数型はそれぞれULong
・UInteger
・UShort
となります。 8ビットの符号なし整数型Byte
に対応する符号付き(Signed)整数型はSByte
となります。 対応関係は次のとおりです。
型 | サイズ | |
---|---|---|
符号付き (Signed) |
符号なし (Unsigned) |
|
Long | ULong | 64ビット (8バイト) |
Integer | UInteger | 32ビット (4バイト) |
Short | UShort | 16ビット (2バイト) |
SByte | Byte | 8ビット (1バイト) |
最小値・最大値
各整数型の最小値・最大値はMinValue
・MaxValue
フィールドを参照することで取得できます。 具体的な値は次のようになります。 なお、表中の16進数表記の値には型のサフィックスを付けています。
型 | 最小値 | 最大値 | |
---|---|---|---|
8ビット整数型 | SByte | -128 &H80 |
+127 &H7F |
Byte | 0 &H00 |
+255 &HFF |
|
16ビット整数型 | Short | -32,768 &H8000S |
+32,767 &H7FFFS |
UShort | 0 &H0000US |
+65,535 &HFFFFUS |
|
32ビット整数型 | Integer | -2,147,483,648 &H80000000I |
+2,147,483,647 &H7FFFFFFFI |
UInteger | 0 &H00000000UI |
+4,294,967,295 &HFFFFFFFFUI |
|
64ビット整数型 | Long | -9,223,372,036,854,775,808 &H8000000000000000L |
+9,223,372,036,854,775,807 &H7FFFFFFFFFFFFFFFL |
ULong | 0 &H0000000000000000UL |
+18,446,744,073,709,551,615 &HFFFFFFFFFFFFFFFFUL |
その他各整数型の詳しい特性については型の種類・サイズ・精度・値域を参照してください。
符号なし整数値の代入
符号なし型に値を代入しようとする場合、値の型に注意する必要があります。 例えば、次のようなコードではコンパイルエラーBC30439が発生します。
これは、値&HFFFFFFFF
がInteger型(符号付き)の数値を表していることが原因で発生するエラーです。 この例では、UInteger型の変数に符号付きの値&HFFFFFFFF
つまり-1
を代入しようとしていることからエラーとなっています。
このような場合には、値がUInteger型であることを表すサフィックスUI
を付けます。 これにより&HFFFFFFFFUI
は符号なしの値4294967295
を表すことになり、コンパイルエラーは発生しなくなります。
サフィックスは型によって異なります。 詳しくはリテラルとサフィックス §.サフィックスをご覧ください。
型の変換
符号付き整数型への変換を行うCInt
などと同様に、符号なし整数型への変換を行う関数が用意されています。
符号付き型への変換 | 符号なし型への変換 | |
---|---|---|
8ビット整数型への変換 | CSByte | CByte |
16ビット整数型への変換 | CShort | CUShort |
32ビット整数型への変換 | CInt | CUInt |
64ビット整数型への変換 | CLng | CULng |
負数から符号なし型への変換
CULong
・CUInt
・CUShort
など符号なし型への変換を行う関数ではオーバーフローのチェックが行われます。 そのため、C言語での符号付き型→符号なし型のキャストのようにバイト表現はそのままで型だけを変える、といった目的でCUInt
などを使うことはできません。 値が負の場合にはCUInt
は例外OverflowExceptionをスローします。
こういった場合には、次のように一旦Long型に変換してからバイト表現を符号なしに変更するなど、CUInt
に渡す値が負数とならないようにする必要があります。
値が正の場合も考慮した、オーバーフローのチェックを行わないCUInt
を関数化すると次のようになります。
CLS準拠
符号なし型のULong
・UInteger
・UShort
と、符号付き型のSByte
は、CLS非準拠な型です。 これらの型をアセンブリ外部に公開するメソッドなどで使用していると、警告BC40028が発生します。
この警告を抑止するには、AssemblyInfo.vbなどに記述されているCLSCompliant属性の引数をFalse
にしてプロジェクト(アセンブリ)がCLSに準拠していないことを明示します。
もしくは、原因となるクラスやメソッドなどに対して個別にCLSCompliant属性を指定して、クラスやメソッドがCLSに準拠していないことを明示します。
CLS準拠に関しては言語間の相互運用性と共通言語仕様 (CLS)で詳しく解説しています。