我询问了VB.NET在Stack Overflow问题 Unsigned left shift in VB.NET? 中将所有数字视为已签名类型的不稳定行为,并从那里接受的答案,得到了。根据答案:
Visual Basic文字
另外请记住,你可以在VB.NET中为你的代码添加文字,并明确地将常量表示为无符号。
所以我尝试了这个:
Friend Const POW_1_32 As UInt32 = 4294967296UI
VB.NET在IDE中抛出Overflow
错误。拉出整数溢出检查似乎没有帮助 - 这似乎是IDE本身的一个缺陷。
然而,这不会产生错误:
Friend Const POW_1_32 As UInt64 = 4294967296UL
所以这告诉我IDE没有正确解析代码并理解Int32和UInt32之间的区别。微软何时会为框架内置的无符号数据类型而不是当前的黑客攻击提供任何建议的解决方法和/或可能的线索?
编辑:忽略我。所有答案都是正确的,我在这个深夜有一个白痴时刻。对于UInt32数据类型,该值太大。 :: facepalm ::
答案 0 :(得分:1)
您的号码超出了无符号32位数的范围。我认为VB.NET在引发错误方面是正确的。
答案 1 :(得分:1)
这里没有任何阴险的错误或黑客攻击。您尝试分配给UInt32
类型的数字仅大于其允许的最大值。为什么要得出微软搞砸了的结论?
UInt32
类型的最大值为4,294,967,295。您正在尝试分配一个大于最大值(4,294,967,296)的值。因此,编译器在抛出溢出错误时是正确的。这是预期的行为。
当您尝试将相同的数字分配给UInt64
时,一切正常,因为它的最大值远大于18,446,744,073,709,551,615 - 值4,294,967,296完全在其范围内。
答案 2 :(得分:0)
最大可能的无符号整数是4294967295.您的值需要存储33位,这会溢出UInt32类型。