【问题标题】:Cannot use a bitwise And with a negative number不能使用带负数的按位 And
【发布时间】:2023-03-24 14:44:01
【问题描述】:

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

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

但是计算机返回“常量表达式在'SByte'类型中不可表示”为什么这不起作用?为了安全起见,我试图用转换来包围它。 SByte 就像 -1281000 0000&HFF1111 1111。把它们排成一行

 1000 0000
 1111 1111 And
 1000 0000

这仍然是 -128 并且对于 SByte 是合法的。我错过了什么?

【问题讨论】:

  • 当您说“不会发生”时,实际上会发生什么? 某些事情必须发生,而不是你所期望的。
  • Greg,它不会编译。这对我来说有点模糊。对不起。
  • 但是-128 And &HFF的实际结果是128,对吧?作为整数?
  • 如果不能编译,为什么你没有提供编译器错误,而不是让我们猜测问题可能是什么?

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


【解决方案1】:

默认情况下,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。删除整数溢出检查可能会导致溢出条件中出现意外值,因此您必须注意这些。

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

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

【讨论】:

    猜你喜欢
    • 2023-01-12
    • 2011-10-12
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多