运算符结果的数据类型 (Visual Basic)
Visual Basic 基于操作数的数据类型确定运算的结果数据类型。 在某些情况下,这可能是范围比任一操作数的范围都要大的数据类型。
数据类型范围
相关数据类型的范围如下所示(按从最小到最大的顺序):
Boolean — 两个可能值
Decimal — 1.5...E+29 个可能整型值,最大范围为 7.9...E+28(绝对值)
Single — 最大范围为 3.4...E+38(绝对值)
Double — 最大范围为 1.7...E+308(绝对值)
有关 Visual Basic 数据类型的详细信息,请参阅数据类型。
如果操作数的计算结果为 Nothing,则 Visual Basic 算术运算符会将它视为零。
小数算术运算
请注意,Decimal 数据类型既不是浮点数,也不是整数。
如果 +
、–
、*
、/
或 Mod
运算的任一操作数为 Decimal
,而另一个操作数不是 Single
或 Double
,则 Visual Basic 会将另一个操作数扩大为 Decimal
。 它采用 Decimal
执行运算,结果数据类型为 Decimal
。
浮点算术运算
Visual Basic 采用 Double 执行大多数浮点算术运算,这是此类运算的最高效数据类型。 但是,如果一个操作数为 Single,而另一个操作数不是 Double
,则 Visual Basic 会采用 Single
执行运算。 它会在运算之前根据需要将每个操作数扩大为适当的数据类型,结果会具有该数据类型。
/ 和 ^ 运算符
/
运算符仅针对 Decimal、Single 和 Double 数据类型进行定义。 Visual Basic 会在运算之前根据需要将每个操作数扩大为适当的数据类型,结果会具有该数据类型。
下表显示 /
运算符的结果数据类型。 请注意,此表是对称的;对于给定操作数数据类型的组合,无论操作数的顺序如何,结果数据类型都是相同的。
Decimal |
Single |
Double |
任何整数类型 | |
---|---|---|---|---|
Decimal |
小数 | Single | Double | 小数 |
Single |
Single | Single | Double | Single |
Double |
Double | 双精度 | 双精度 | Double |
任何整数类型 | 小数 | Single | Double | Double |
^
运算符仅针对 Double
数据类型进行定义。 Visual Basic 会在运算之前根据需要将每个操作数扩大为 Double
,结果数据类型始终为 Double
。
整数算术运算
整数运算的结果数据类型取决于操作数的数据类型。 一般而言,Visual Basic 使用以下策略确定结果数据类型:
如果二元运算符的两个操作数具有相同数据类型,则结果会具有该数据类型。 例外情况是
Boolean
,它会强制转换为Short
。如果无符号操作数与带符号操作数一起进行运算,则结果会具有带符号类型,其范围至少与任一操作数的范围一样大。
否则,结果通常具有两个操作数数据类型中较大的一个。
请注意,结果数据类型可能不与任一操作数数据类型相同。
注意
结果数据类型并不总是足够大到可容纳运算生成的所有可能值。 如果值对于结果数据类型太大,则可能会发生 OverflowException 异常。
一元 + 和 – 运算符
下表显示两个一元运算符 +
和 –
的结果数据类型。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
---|---|---|---|---|---|---|---|---|---|
一元 + |
Short | SByte | Byte | Short | UShort | Integer | UInteger | Long | ULong |
一元 – |
Short | SByte | Short | Short | Integer | Integer | Long | Long | 小数 |
<< 和 >> 运算符
下表显示两个移位运算符 <<
和 >>
的结果数据类型。 Visual Basic 会将每个移位运算符视为针对其左操作数(要移动的位模式)的一元运算符。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
---|---|---|---|---|---|---|---|---|---|
<< 、>> |
Short | SByte | Byte | Short | UShort | Integer | UInteger | Long | ULong |
如果左操作数为 Decimal
、Single
、Double
或 String
,则 Visual Basic 会尝试在运算之前将它转换为 Long
,结果数据类型为 Long
。 右操作数(要移动的位位置数量)必须为 Integer
或是扩大为 Integer
的类型。
二元 +、–、* 和 Mod 运算符
下表显示二元 +
和 –
运算符以及 *
和 Mod
运算符的结果数据类型。 请注意,此表是对称的;对于给定操作数数据类型的组合,无论操作数的顺序如何,结果数据类型都是相同的。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
---|---|---|---|---|---|---|---|---|---|
Boolean |
Short | SByte | Short | Short | Integer | Integer | Long | Long | 小数 |
SByte |
SByte | SByte | Short | Short | Integer | Integer | Long | Long | 小数 |
Byte |
Short | Short | Byte | Short | UShort | Integer | UInteger | Long | ULong |
Short |
Short | Short | Short | Short | Integer | Integer | Long | Long | 小数 |
UShort |
Integer | Integer | UShort | Integer | UShort | Integer | UInteger | Long | ULong |
Integer |
Integer | Integer | Integer | Integer | Integer | Integer | Long | Long | 小数 |
UInteger |
Long | Long | UInteger | Long | UInteger | Long | UInteger | Long | ULong |
Long |
Long | Long | Long | Long | Long | Long | Long | Long | 小数 |
ULong |
小数 | 小数 | ULong | 小数 | ULong | 小数 | ULong | 小数 | ULong |
\ 运算符
下表显示 \
运算符的结果数据类型。 请注意,此表是对称的;对于给定操作数数据类型的组合,无论操作数的顺序如何,结果数据类型都是相同的。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
---|---|---|---|---|---|---|---|---|---|
Boolean |
Short | SByte | Short | Short | Integer | Integer | Long | Long | Long |
SByte |
SByte | SByte | Short | Short | Integer | Integer | Long | Long | Long |
Byte |
Short | Short | Byte | Short | UShort | Integer | UInteger | Long | ULong |
Short |
Short | Short | Short | Short | Integer | Integer | Long | Long | Long |
UShort |
Integer | Integer | UShort | Integer | UShort | Integer | UInteger | Long | ULong |
Integer |
Integer | Integer | Integer | Integer | Integer | Integer | Long | Long | Long |
UInteger |
Long | Long | UInteger | Long | UInteger | Long | UInteger | Long | ULong |
Long |
Long | Long | Long | Long | Long | Long | Long | Long | Long |
ULong |
Long | Long | ULong | Long | ULong | Long | ULong | Long | ULong |
如果 \
运算符的任一操作数为 Decimal、Single 或 Double,则 Visual Basic 会尝试在运算前将它转换为 Long,结果数据类型为 Long
。
关系和按位比较
关系运算(=
、<>
、<
、>
、<=
、>=
)的结果数据类型始终为 Boolean
Boolean 数据类型。 对于针对 Boolean
操作数进行的逻辑运算(And
、AndAlso
、Not
、Or
、OrElse
、Xor
),情况也是如此。
按位逻辑运算的结果数据类型取决于操作数的数据类型。 请注意,AndAlso
和 OrElse
仅针对 Boolean
进行定义,Visual Basic 在执行运算之前会根据需要将每个操作数转换为 Boolean
。
=、<>、<、>、<= 和 >= 运算符
如果两个操作数都为 Boolean
,则 Visual Basic 会将 True
视为小于 False
。 如果将数字类型与 String
进行比较,则 Visual Basic 会在运算之前尝试将 String
转换为 Double
。 Char
或 Date
操作数只能与相同数据类型的另一个操作数进行比较。 结果数据类型始终为 Boolean
。
按位 Not 运算符
下表显示按位 Not
运算符的结果数据类型。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
---|---|---|---|---|---|---|---|---|---|
Not |
布尔 | SByte | Byte | Short | UShort | Integer | UInteger | Long | ULong |
如果操作数为 Decimal
、Single
、Double
或 String
,则 Visual Basic 会尝试在运算之前将它转换为 Long
,结果数据类型为 Long
。
按位 And、Or 和 Xor 运算符
下表显示按位 And
、Or
和 Xor
运算符的结果数据类型。 请注意,此表是对称的;对于给定操作数数据类型的组合,无论操作数的顺序如何,结果数据类型都是相同的。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
---|---|---|---|---|---|---|---|---|---|
Boolean |
布尔 | SByte | Short | Short | Integer | Integer | Long | Long | Long |
SByte |
SByte | SByte | Short | Short | Integer | Integer | Long | Long | Long |
Byte |
Short | Short | Byte | Short | UShort | Integer | UInteger | Long | ULong |
Short |
Short | Short | Short | Short | Integer | Integer | Long | Long | Long |
UShort |
Integer | Integer | UShort | Integer | UShort | Integer | UInteger | Long | ULong |
Integer |
Integer | Integer | Integer | Integer | Integer | Integer | Long | Long | Long |
UInteger |
Long | Long | UInteger | Long | UInteger | Long | UInteger | Long | ULong |
Long |
Long | Long | Long | Long | Long | Long | Long | Long | Long |
ULong |
Long | Long | ULong | Long | ULong | Long | ULong | Long | ULong |
如果操作数为 Decimal
、Single
、Double
或 String
,则 Visual Basic 会尝试在运算之前将它转换为 Long
,结果数据类型与该操作位已为 Long
的情况相同。
其他运算符
&
运算符仅针对 String
操作数的串联进行定义。 Visual Basic 会在运算之前根据需要将每个操作数转换为 String
,结果数据类型始终为 String
。 为实现 &
运算符的用途,到 String
的所有转换都被视为扩大,即使 Option Strict
为 On
。
Is
和 IsNot
运算符要求两个操作数都属于引用类型。 TypeOf
...Is
表达式要求第一个操作数属于引用类型,第二个操作数为数据类型的名称。 在所有这些情况下,结果数据类型都为 Boolean
。
Like
运算符仅针对 String
操作数的模式匹配进行定义。 Visual Basic 会尝试在运算之前根据需要将每个操作数转换为 String
。 结果数据类型始终为 Boolean
。