VB.NET中的无符号左移?

时间:2010-12-23 01:10:24

标签: vb.net bit-shift

对于大家来说这应该是一个简单的方法,但是如何在使用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框架那样骇人听闻?微软真的难以制作框架固有的无符号数据类型吗?

1 个答案:

答案 0 :(得分:4)

  

最后一个特别令人迷惑。   172&lt;&lt; 24仅为2,885,681,152,   完全受限制   UInt32数据类型。我的假设是   .NET正在签名中进行左移   模式,然后尝试转换为   没有签名,而且这种情况有所不同   错误。

这个错误没有错。 172占用8位。你将它移位24位,第8位现在是第32位。这是一个保留的符号位。因此,它在技术上是溢出的。


处理像C#<​​/ h2>这样的整数 与 C#不同,

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) 

Visual Basic文字

另请注意,您可以在VB.NET中将literals添加到代码中,并将常量明确表示为无符号。