积极答复者
请教算术运算符的问题-有点菜了

问题
答案
-
我已经找到了方法:)
Code SnippetPrivate 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
全部回复
-
周雪峰 写: 你好!
逻辑运算和算术运算是不同的两种运算,得到的结果也不一样。
应该尽量来避免益出,一旦你的程序益出了会抛出异常。
如果有可能益出,应该选择范围更大的变量类型。看看这个函数,刚刚在网上找到的,可能你会明白我的意思。有时候我必须使两个数相加,但是要对他们溢出进行处理,使得结果仍保持在变量类型范围内,效果就跟2进制累加时一样,进位时溢出的部分舍去
0x111111111111 +1 = 0x000000000000
Code SnippetPrivate 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=&H40000000If 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 -
我已经找到了方法:)
Code SnippetPrivate 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