【问题标题】:Allow Addition Overflow in vb.net允许 vb.net 中的加法溢出
【发布时间】:2014-03-16 20:10:05
【问题描述】:

我正在开发一个需要将多个整数相加的 vb.net 应用程序。整数是无符号的,长度为 32 位。

预计整数会很大,以至于在加法时它们会溢出。如果确实发生任何溢出,我不想存储任何溢出,或者发生任何异常。

例如,如果我使用 4 位数字,我会想要以下行为:

1111 + 0010 = 0001

我尝试了以下方法来查看溢出时会发生什么 - 我得到了溢出异常。有什么优雅的方法吗?

Dim test As UInt32 = UInt32.MaxValue

Console.WriteLine(test.ToString())

test = test + 1

Console.WriteLine(test.ToString())

我目前使用 UInt32 来表示整数,但是如果有人知道更好的类型,这可以更改。

不存储溢出位很重要,因为稍后我将要对这些数字执行位移等。

我可以看到在 UInt64 和 UInt32 之间转换的明显解决方案,但是我将来可能必须扩展应用程序以使用 64 位数字(所以有一个易于扩展的解决方案会很好)

提前致谢,

戴夫

【问题讨论】:

    标签: vb.net addition unsigned-integer overflowexception


    【解决方案1】:

    您可以在“项目”->“属性...”->“编译”选项卡->“高级编译选项...”中使用“删除整数溢出检查”选项

    Dim a As UInt32 = UInt32.MaxValue
    a += 1
    Console.WriteLine(a) ' outputs 0
    

    【讨论】:

    • 这正是我想要的。非常感谢。
    【解决方案2】:

    您必须使用 64 位整数(在您的 VB 版本中它们可能被称为 Longs)。

    Dim Value1 As Long = 12345
    Dim Value2 As Long = 67890
    Dim Result As Long = Value1 + Value2
    
    ' Remove the overflow from the result
    Console.WriteLine(Result AND &HFFFF)
    

    您可以使用有符号或无符号整数,但您必须将存储空间加倍才能使其正常工作(例如,16 到 32)。

    【讨论】:

    • 我想过这样的事情,但如果我想在未来使用 64 位数字进行溢出,问题就会出现,我将不得不进行循环移位等这些数字,所以它可能会引起头痛......不过感谢您的建议。
    • 您也可以用 &H7FFF 标记单个值。这将防止溢出。而且您不必关闭溢出检查。
    猜你喜欢
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    相关资源
    最近更新 更多