none
请教算术运算符的问题-有点菜了 RRS feed

  • 问题

  •  

    在VB2008中,

    如果两个数进行+-*/的运算,可能会超出定义的类型范围,导致溢出,但是如果采用位逻辑运算则不会溢出。

     

    这里想请教一下该怎么实现?

    例如:

     

    Code Snippet

     

    Dim Sum As UInteger = 4294967295UI  '范围是0到4,294,967,295

     

     

     

    Sum再加1,该如何实现呢?

     

    谢谢指教:)

    2009年1月10日 8:53

答案

  • 你好!
       逻辑运算和算术运算是不同的两种运算,得到的结果也不一样。
       应该尽量来避免益出,一旦你的程序益出了会抛出异常。
       如果有可能益出,应该选择范围更大的变量类型。
    2009年1月10日 12:28
    版主
  • 设置   项目属性->移除整数溢出检查

     

    2009年1月12日 1:34
    版主
  • 我已经找到了方法:)

     

    Code Snippet
    Private Shared Function Plus(ByVal Int32A As Int32, ByVal Int32B As Int32) As Int32 '长整数加法函数 
        If (Int32A Xor Int32B) And &H80000000 Then
            Return Int32A + Int32B '异号直接加
        Else
            Return (Int32A Xor &H80000000) + Int32B Xor &H80000000 '同号变了号再加
            'A Xor &H80000000 相当于A-2147483648
        End If
    End Function

    Private Shared Function Minus(ByVal Int32A As Int32, ByVal Int32B As Int32) As Int32 '长整数减法函数 
        Return Plus(Int32A, -Int32B)
    End Function

     

     

     

     

    2009年1月20日 16:56

全部回复

  • 你好!
       逻辑运算和算术运算是不同的两种运算,得到的结果也不一样。
       应该尽量来避免益出,一旦你的程序益出了会抛出异常。
       如果有可能益出,应该选择范围更大的变量类型。
    2009年1月10日 12:28
    版主
  •  周雪峰 写:
    你好!
       逻辑运算和算术运算是不同的两种运算,得到的结果也不一样。
       应该尽量来避免益出,一旦你的程序益出了会抛出异常。
       如果有可能益出,应该选择范围更大的变量类型。

     

    看看这个函数,刚刚在网上找到的,可能你会明白我的意思。有时候我必须使两个数相加,但是要对他们溢出进行处理,使得结果仍保持在变量类型范围内,效果就跟2进制累加时一样,进位时溢出的部分舍去

    0x111111111111     +1     =  0x000000000000

     

    Code Snippet

    Private Shared Function Plus(ByVal lX As Int32, ByVal lY As Int32) As Int32 '长整数加法函数
                Dim lX4 As Int32, lY4 As Int32, lX8 As Int32, lY8 As Int32, lResult As Int32
                lX8 = lX And &H80000000 'lX<&H80000000返回0, lX>=&H80000000返回&H80000000 '2147483648
                lY8 = lY And &H80000000
                lX4 = lX And &H40000000 'lX<&H40000000返回0, lX>=&H40000000返回&H40000000 'Integer的最大值为&H40000000=2147483647
                lY4 = lY And &H40000000
                lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF) '&H3FFFFFFF+1=&H40000000

                If lX4 And lY4 Then '(-1 and -1)=True
                    lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
                ElseIf lX4 Or lY4 Then 'lX4=-1 或 lY4=-1
                    If lResult And &H40000000 Then
                        lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
                    Else
                        lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
                    End If
                Else
                    lResult = lResult Xor lX8 Xor lY8
                End If
                Return lResult
    End Function

     

     

     

     

     

    2009年1月10日 13:04
  • 明白你的意思了!
    2009年1月10日 13:15
    版主
  •  

    不过那段函数看着挺费解的:)

    我到现在还没能全看明白末尾几行到底怎么作用的呢

    2009年1月10日 14:45
  • 设置   项目属性->移除整数溢出检查

     

    2009年1月12日 1:34
    版主
  • 你自己拿一个数据,从头到尾的跟着他的程序自己看看他每一步都作了什么处理就明白了。
    2009年1月12日 5:08
    版主
  • 我已经找到了方法:)

     

    Code Snippet
    Private Shared Function Plus(ByVal Int32A As Int32, ByVal Int32B As Int32) As Int32 '长整数加法函数 
        If (Int32A Xor Int32B) And &H80000000 Then
            Return Int32A + Int32B '异号直接加
        Else
            Return (Int32A Xor &H80000000) + Int32B Xor &H80000000 '同号变了号再加
            'A Xor &H80000000 相当于A-2147483648
        End If
    End Function

    Private Shared Function Minus(ByVal Int32A As Int32, ByVal Int32B As Int32) As Int32 '长整数减法函数 
        Return Plus(Int32A, -Int32B)
    End Function

     

     

     

     

    2009年1月20日 16:56