不能使用按位和负数

时间:2015-07-14 21:14:21

标签: vb.net bit-manipulation bitwise-operators

似乎任何带负数的按位运算符都不会发生。即使是简单的事情

    Dim b As SByte = CSByte(-128 And &HFF)

但计算机返回"常量表达式在类型&#SB; SByte""中无法表示。为什么那不起作用?为了安全起见,我尝试用转换来包围它。 SByte -1281000 0000&HFF1111 1111。排列它们

 1000 0000
 1111 1111 And
 1000 0000

-128仍为SByte且合法{{1}}。我错过了什么?

1 个答案:

答案 0 :(得分:0)

默认情况下,VB启用了整数溢出检查。编译器可以看到(-128和& HFF)的结果会溢出有符号字节,因此它会给编译器错误:Constant expression not representable in type 'SByte'

下面的代码将编译,但会在运行时生成System.OverflowException,因为结果(128)超出了有符号字节的范围(启用了溢出检查):

Public Shared Sub Main()
    Dim i As Integer = -128 And &HFF
    Dim b As SByte = CSByte(i)
    Console.WriteLine(b)
End Sub

如果您进入项目的属性,并查看高级编译选项,您将看到“删除整数溢出检查”选项。如果检查此值,代码将编译,b中的结果将为-128。删除整数溢出检查可能会导致溢出条件中出现意外值,因此您必须注意这些值。

您也可以使用字节变量,b中的结果将为128:

Public Shared Sub Main()
    Dim b As Byte = CByte(-128 And &HFF)
    Console.WriteLine(b)
End Sub