VB6 UnsignedAuthor: Dave Date: 06.02.15 - 5:30pm There are a couple ways that come to mind to deal with unsigned ints and longs in VB6. MS outlined a native way here Its slightly bulky to use, and Im not sure of its overflow behavior. I want numeric overflow to be handled the same way as C natively would (wrap) So if C already has the right behavior..use C! The below example shows just how simple it is. I have also added 64 bit number support to the Source repo here enum op{ op_add = 0, op_sub = 1, op_div = 2, op_mul = 3, op_mod = 4, op_xor = 5, op_and = 6, op_or = 7 }; unsigned int __stdcall ULong(unsigned int v1, unsigned int v2, int operation){ switch(operation){ case op_add: return v1 + v2; case op_sub: return v1 - v2; case op_div: return v1 / v2; case op_mul: return v1 * v2; case op_mod: return v1 % v2; case op_xor: return v1 ^ v2; case op_and: return v1 & v2; case op_or: return v1 | v2; } return -1; } unsigned short __stdcall UInt(unsigned short v1, unsigned short v2, int operation){ switch(operation){ case op_add: return v1 + v2; case op_sub: return v1 - v2; case op_div: return v1 / v2; case op_mul: return v1 * v2; case op_mod: return v1 % v2; case op_xor: return v1 ^ v2; case op_and: return v1 & v2; case op_or: return v1 | v2; } return -1; } Option Explicit Enum op op_add = 0 op_sub = 1 op_div = 2 op_mul = 3 op_mod = 4 op_xor = 5 op_and = 6 op_or = 7 End Enum Private Declare Function ULong Lib "utypes.dll" (ByVal v1 As Long, ByVal v2 As Long, ByVal operation As Long) As Long Private Declare Function UInt Lib "utypes.dll" (ByVal v1 As Integer, ByVal v2 As Integer, ByVal operation As Long) As Integer Private Sub Command1_Click() On Error Resume Next Dim a As Long Dim b As Integer a = 2147483647 + 1 MsgBox Hex(2147483647) & " + 1 = " & Hex(a) & " Error: " & Err.Description Err.Clear a = -2147483648# - 1 MsgBox Hex(-2147483648#) & " - 1 = " & Hex(a) & " Error: " & Err.Description b = 32767 + 1 MsgBox Hex(32767) & " + 1 = " & Hex(b) & " Error: " & Err.Description Err.Clear b = -32768 - 1 MsgBox Hex(-32768) & " - 1 = " & Hex(b) & " Error: " & Err.Description End Sub Private Sub Form_Load() testLong 2147483647, 1, op_add testLong -2147483648#, 1, op_sub testInt 32767, 1, op_add testInt -32768, 1, op_sub End Sub Output: 7FFFFFFF + 1 = 80000000 80000000 - 1 = 7FFFFFFF 7FFF + 1 = 8000 8000 - 1 = 7FFF Comments: (0) |
About Me More Blogs Main Site |