似乎任何带负数的按位运算符都不会发生。即使是简单的事情
Dim b As SByte = CSByte(-128 And &HFF)
但计算机返回"常量表达式在类型&#SB; SByte""中无法表示。为什么那不起作用?为了安全起见,我尝试用转换来包围它。 SByte
-128
为1000 0000
,&HFF
为1111 1111
。排列它们
1000 0000
1111 1111 And
1000 0000
-128
仍为SByte
且合法{{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