运算符结果的数据类型 (Visual Basic)

Visual Basic 基于操作数的数据类型确定运算的结果数据类型。 在某些情况下,这可能是范围比任一操作数的范围都要大的数据类型。

数据类型范围

相关数据类型的范围如下所示(按从最小到最大的顺序):

  • Boolean — 两个可能值

  • SByteByte — 256 个可能整型值

  • ShortUShort — 65,536 (6.5...E+4) 个可能整型值

  • IntegerUInteger — 4,294,967,296 (4.2...E+9) 个可能整型值

  • LongULong — 18,446,744,073,709,551,615 (1.8...E+19) 个可能整型值

  • 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,而另一个操作数不是 SingleDouble,则 Visual Basic 会将另一个操作数扩大为 Decimal。 它采用 Decimal 执行运算,结果数据类型为 Decimal

浮点算术运算

Visual Basic 采用 Double 执行大多数浮点算术运算,这是此类运算的最高效数据类型。 但是,如果一个操作数为 Single,而另一个操作数不是 Double,则 Visual Basic 会采用 Single 执行运算。 它会在运算之前根据需要将每个操作数扩大为适当的数据类型,结果会具有该数据类型。

/ 和 ^ 运算符

/ 运算符仅针对 DecimalSingleDouble 数据类型进行定义。 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

如果左操作数为 DecimalSingleDoubleString,则 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

如果 \ 运算符的任一操作数为 DecimalSingleDouble,则 Visual Basic 会尝试在运算前将它转换为 Long,结果数据类型为 Long

关系和按位比较

关系运算(=<><><=>=)的结果数据类型始终为 BooleanBoolean 数据类型。 对于针对 Boolean 操作数进行的逻辑运算(AndAndAlsoNotOrOrElseXor),情况也是如此。

按位逻辑运算的结果数据类型取决于操作数的数据类型。 请注意,AndAlsoOrElse 仅针对 Boolean 进行定义,Visual Basic 在执行运算之前会根据需要将每个操作数转换为 Boolean

=、<>、<、>、<= 和 >= 运算符

如果两个操作数都为 Boolean,则 Visual Basic 会将 True 视为小于 False。 如果将数字类型与 String 进行比较,则 Visual Basic 会在运算之前尝试将 String 转换为 DoubleCharDate 操作数只能与相同数据类型的另一个操作数进行比较。 结果数据类型始终为 Boolean

按位 Not 运算符

下表显示按位 Not 运算符的结果数据类型。

Boolean SByte Byte Short UShort Integer UInteger Long ULong
Not 布尔 SByte Byte Short UShort Integer UInteger Long ULong

如果操作数为 DecimalSingleDoubleString,则 Visual Basic 会尝试在运算之前将它转换为 Long,结果数据类型为 Long

按位 And、Or 和 Xor 运算符

下表显示按位 AndOrXor 运算符的结果数据类型。 请注意,此表是对称的;对于给定操作数数据类型的组合,无论操作数的顺序如何,结果数据类型都是相同的。

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

如果操作数为 DecimalSingleDoubleString,则 Visual Basic 会尝试在运算之前将它转换为 Long,结果数据类型与该操作位已为 Long 的情况相同。

其他运算符

& 运算符仅针对 String 操作数的串联进行定义。 Visual Basic 会在运算之前根据需要将每个操作数转换为 String,结果数据类型始终为 String。 为实现 & 运算符的用途,到 String 的所有转换都被视为扩大,即使 Option StrictOn

IsIsNot 运算符要求两个操作数都属于引用类型。 TypeOf...Is 表达式要求第一个操作数属于引用类型,第二个操作数为数据类型的名称。 在所有这些情况下,结果数据类型都为 Boolean

Like 运算符仅针对 String 操作数的模式匹配进行定义。 Visual Basic 会尝试在运算之前根据需要将每个操作数转换为 String。 结果数据类型始终为 Boolean

另请参阅