Visual Basic 根据作数的数据类型确定作的结果数据类型。 在某些情况下,这可能是一种数据类型,其范围大于任一作数的范围。
数据类型范围
相关数据类型的范围(从小到大)如下所示:
布尔值 - 两个可能的值
Short,UShort - 65,536 (6.5...E+4) 可能的整型值
Long、 ULong - 18,446,744,073,709,551,615 (1.8...E+19) 可能的整数值
十进制 - 1.5...E+29 可能的整数值,最大范围 7.9...E+28 (绝对值)
单个 - 最大范围 3.4...E+38 (绝对值)
双精度 - 最大范围 1.7...E+308 (绝对值)
有关 Visual Basic 数据类型的详细信息,请参阅 数据类型。
如果作数的计算结果为 Nothing,则 Visual Basic 算术运算符将它视为零。
十进制算术
请注意, 十进制 数据类型既不是浮点数据类型,也不是整数。
如果任一+作数、–作/*数或Mod作不是DecimalSingle,或者 DoubleVisual Basic 将另一个作数扩大为Decimal。 它执行作 Decimal,结果数据类型为 Decimal。
Floating-Point 算术
Visual Basic 在 Double 中执行大多数浮点算术,这是此类作最有效的数据类型。 但是,如果一个作数是 Single ,另一个作数不是 Double,则 Visual Basic 将 Single执行该作。 它根据需要将每个作数扩展为作前的相应数据类型,并且结果具有该数据类型。
/ 和 ^ 运算符
运算符 / 仅针对 Decimal、 Single 和 Double 数据类型定义。 Visual Basic 根据需要将每个作数扩展为作前的相应数据类型,并且结果具有该数据类型。
下表显示了运算符的结果数据类型 / 。 请注意,此表是对称的;对于作数数据类型的给定组合,无论作数的顺序如何,结果数据类型都是相同的。
Decimal |
Single |
Double |
任何整数类型 | |
|---|---|---|---|---|
Decimal |
十进制 | 单身 | 加倍 | 十进制 |
Single |
单身 | 单身 | 加倍 | 单身 |
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 | 整数 | UInteger | 长整型 | ULong |
元 – |
Short | SByte | Short | Short | 整数 | 整数 | 长整型 | 长整型 | 十进制 |
<< 和 >> 运算符
下表显示了两个位移运算符的结果数据类型, << 以及 >>。 Visual Basic 将每个位移运算符视为其左作数上的一元运算符(要移动的位模式)。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
|---|---|---|---|---|---|---|---|---|---|
<<、>> |
Short | SByte | 字节(Byte) | Short | UShort | 整数 | UInteger | 长整型 | ULong |
如果左侧作数为、、或 Visual Basic 尝试在作之前将其Long转换为,则结果数据类型为 Long。StringDoubleSingleDecimal 右作数(要移动的位位置数)必须是 Integer 或扩大为 Integer的类型。
二进制 +、–、*和 Mod 运算符
下表显示了二进制 + 和运算符和 –*Mod 运算符的结果数据类型。 请注意,此表是对称的;对于作数数据类型的给定组合,无论作数的顺序如何,结果数据类型都是相同的。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
|---|---|---|---|---|---|---|---|---|---|
Boolean |
Short | SByte | Short | Short | 整数 | 整数 | 长整型 | 长整型 | 十进制 |
SByte |
SByte | SByte | Short | Short | 整数 | 整数 | 长整型 | 长整型 | 十进制 |
Byte |
Short | Short | 字节(Byte) | Short | UShort | 整数 | UInteger | 长整型 | ULong |
Short |
Short | Short | Short | Short | 整数 | 整数 | 长整型 | 长整型 | 十进制 |
UShort |
整数 | 整数 | UShort | 整数 | UShort | 整数 | UInteger | 长整型 | ULong |
Integer |
整数 | 整数 | 整数 | 整数 | 整数 | 整数 | 长整型 | 长整型 | 十进制 |
UInteger |
长整型 | 长整型 | UInteger | 长整型 | UInteger | 长整型 | UInteger | 长整型 | ULong |
Long |
长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 十进制 |
ULong |
十进制 | 十进制 | ULong | 十进制 | ULong | 十进制 | ULong | 十进制 | ULong |
\算子
下表显示了运算符的结果数据类型 \ 。 请注意,此表是对称的;对于作数数据类型的给定组合,无论作数的顺序如何,结果数据类型都是相同的。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
|---|---|---|---|---|---|---|---|---|---|
Boolean |
Short | SByte | Short | Short | 整数 | 整数 | 长整型 | 长整型 | 长整型 |
SByte |
SByte | SByte | Short | Short | 整数 | 整数 | 长整型 | 长整型 | 长整型 |
Byte |
Short | Short | 字节(Byte) | Short | UShort | 整数 | UInteger | 长整型 | ULong |
Short |
Short | Short | Short | Short | 整数 | 整数 | 长整型 | 长整型 | 长整型 |
UShort |
整数 | 整数 | UShort | 整数 | UShort | 整数 | UInteger | 长整型 | ULong |
Integer |
整数 | 整数 | 整数 | 整数 | 整数 | 整数 | 长整型 | 长整型 | 长整型 |
UInteger |
长整型 | 长整型 | UInteger | 长整型 | UInteger | 长整型 | UInteger | 长整型 | ULong |
Long |
长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 |
ULong |
长整型 | 长整型 | ULong | 长整型 | ULong | 长整型 | ULong | 长整型 | ULong |
如果运算符的任一作数 \ 是 Decimal、 Single 或 Double,则 Visual Basic 将尝试在作前将其转换为 Long ,并且结果数据类型为 Long。
关系比较和按位比较
关系作(=、、<><、>、、<=)>=的结果数据类型始终Boolean为布尔数据类型。 对于作数上的Boolean逻辑运算(And、、AndAlsoNot、Or、OrElse、Xor)也是如此。
按位逻辑作的结果数据类型取决于作数的数据类型。 请注意, AndAlso 并且 OrElse 仅针对 Boolean该作数定义,并且 Visual Basic 会根据需要 Boolean 将每个作数转换为执行该作之前。
=、、<>、><、<=和 >= 运算符
如果两个作数都是 Boolean,则 Visual Basic 认为 True 小于 False。 如果数值类型与 a String进行比较,则 Visual Basic 将尝试在作之前转换为StringDouble该类型。 一 Char 个或多个 Date 作数只能与同一数据类型的另一个作数进行比较。 结果数据类型始终 Boolean为 .
按位非运算符
下表显示了按位 Not 运算符的结果数据类型。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
|---|---|---|---|---|---|---|---|---|---|
Not |
布尔 | SByte | 字节(Byte) | Short | UShort | 整数 | UInteger | 长整型 | ULong |
如果作数为、、或 Visual Basic 尝试在作之前将其Long转换为,则结果数据类型为 Long。StringDoubleSingleDecimal
按位和或 Xor 运算符
下表显示了按位AndOr运算符和Xor运算符的结果数据类型。 请注意,此表是对称的;对于作数数据类型的给定组合,无论作数的顺序如何,结果数据类型都是相同的。
Boolean |
SByte |
Byte |
Short |
UShort |
Integer |
UInteger |
Long |
ULong |
|
|---|---|---|---|---|---|---|---|---|---|
Boolean |
布尔 | SByte | Short | Short | 整数 | 整数 | 长整型 | 长整型 | 长整型 |
SByte |
SByte | SByte | Short | Short | 整数 | 整数 | 长整型 | 长整型 | 长整型 |
Byte |
Short | Short | 字节(Byte) | Short | UShort | 整数 | UInteger | 长整型 | ULong |
Short |
Short | Short | Short | Short | 整数 | 整数 | 长整型 | 长整型 | 长整型 |
UShort |
整数 | 整数 | UShort | 整数 | UShort | 整数 | UInteger | 长整型 | ULong |
Integer |
整数 | 整数 | 整数 | 整数 | 整数 | 整数 | 长整型 | 长整型 | 长整型 |
UInteger |
长整型 | 长整型 | UInteger | 长整型 | UInteger | 长整型 | UInteger | 长整型 | ULong |
Long |
长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 | 长整型 |
ULong |
长整型 | 长整型 | ULong | 长整型 | ULong | 长整型 | ULong | 长整型 | ULong |
如果作数为、、或 Visual Basic 尝试在作之前将其转换为,Long并且结果数据类型与作数已Long相同。StringDoubleSingleDecimal
其他运算符
运算符 & 仅用于 String 连接作数。 Visual Basic 根据需要 String 将每个作数转换为作前,结果数据类型始终为 String。 出于运算符的目的 & ,要进行的所有转换 String 都被视为扩大,即使 Option Strict 是 On。
和IsIsNot运算符要求两个作数都为引用类型。 ... TypeOfIs 表达式要求第一个作数是引用类型,第二个作数是数据类型的名称。 在所有这些情况下,结果数据类型为 Boolean.
仅 Like 针对作数的 String 模式匹配定义运算符。 Visual Basic 会根据需要 String 尝试将每个作数转换为作之前。 结果数据类型始终 Boolean为 .