对于大家来说这应该是一个简单的方法,但是如何在使用Option Strict
时在VB.NET中拉出未签名的左移?
也许我做错了,但在尝试实现我自己的IP2Long功能时(我有我的理由),我正在测试一些东西,以确保我的头脑正好适应转换过程。我尝试了一些测试,似乎都会导致错误。
Dim a As Int32
a = CUint(172 << 24) 'Constant expression not representable in type 'UInteger'
a = DirectCast((172 << 24), UInt32) 'Value of type 'Integer' cannot be converted to 'UInteger'
a = Convert.ToUInt32(172 << 24) 'Compiles, but throws an OverflowException
最后一个特别令人迷惑。 172 << 24
仅为2,885,681,152,远低于UInt32数据类型所施加的限制。我的假设是.NET在签名模式下进行左移,然后尝试转换为无符号,这会抛出某种错误。
基本上,我的问题可以归结为:为什么无符号数字有时会像.NET框架那样骇人听闻?微软真的难以制作框架固有的无符号数据类型吗?
答案 0 :(得分:4)
最后一个特别令人迷惑。 172&lt;&lt; 24仅为2,885,681,152, 完全受限制 UInt32数据类型。我的假设是 .NET正在签名中进行左移 模式,然后尝试转换为 没有签名,而且这种情况有所不同 错误。
这个错误没有错。 172占用8位。你将它移位24位,第8位现在是第32位。这是一个保留的符号位。因此,它在技术上是溢出的。
VB.NET 将检查整数溢出。
让 VB.NET 忽略 OveflowExceptions异常转到:
Project properties->Compile->Advanced Compiler Option->"Remove integer overflow checks"
或compile与
vbc foo.vb /removeintchecks
如果您决定在代码中保留溢出检查,则必须明确告诉它您正在使用BitConverter类进行位操作:
''//This will work
a = BitConverter.ToInt32(BitConverter.GetBytes(172 << 24), 0)
另请注意,您可以在VB.NET中将literals添加到代码中,并将常量明确表示为无符号。