Quantcast
Channel: VBForums - CodeBank - Visual Basic 6 and earlier
Viewing all articles
Browse latest Browse all 1470

CInt64() How to use it.

$
0
0
Using integer division on long long works.
Here is the output from this module.
You can use long long for calculations.
See the power function. Also I found that 2^63 return negative, the actual unsigned number in bits &H8000000000000000



Quote:

12345678912345678 Long Long
6172839456172839 Long Long
4611686018427387904 = 2^62
4000000000000000
3737184779924949 Long Long
8000000000000000
9223372036854775807
-9223372036854775808
4294967295

Code:

Private Declare Sub GetMem2 Lib "msvbvm60" (ByVal Addr As Long, retval As Integer)
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
Private Declare Sub PutMem2 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Integer)
Private Declare Sub PutMem1 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Byte)
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private maxlonglong, limitlonglong
Sub main()
maxlonglong = CDec("18446744073709551616")
limitlonglong = CDec("9223372036854775808")
Dim a, b
a = cInt64("12345678912345678")
Debug.Print a, VarTypeName(a)
Debug.Print a \ 2, VarTypeName(a \ 2)
b = cInt64(123)
a = IntExp(cInt64(2), cInt64(62), OneLongLong)  ' 2^62  (2^63 return right bits for unsigned, but as negative signed)
Debug.Print a, " = 2^62"
Debug.Print Hex64(a)
Debug.Print a \ cInt64(1234), VarTypeName(a \ cInt64(1234))
'a = OneLongLong
a = IntExp(cInt64(2), cInt64(63), OneLongLong)
Debug.Print Hex64(a)
Debug.Print cInt64("&H7FFFFFFFFFFFFFFF")
Debug.Print cInt64("&H8000000000000000")
Debug.Print cInt64("&H00000000FFFFFFFF") ' always feed the zero to get unsigned long as long long



End Sub
Public Function myVarType(z, j As Integer) As Boolean
Dim i As Integer
GetMem2 VarPtr(z), i
myVarType = i = j
End Function
Public Function IntExp(n, x, ByVal R)
On Error GoTo 100
    While x > 0: If x Mod 2 = 1 Then x = x - 1: R = R * n
    x = x \ 2: If x > 0 Then n = n * n
    Wend
    IntExp = R
    Exit Function
100: Err.Clear
    R = 0.5
End Function
Public Function VarTypeName(v) As String
Dim n As Integer
GetMem2 VarPtr(v), n


    Select Case n And &H7FF
        Case 0
            VarTypeName = "Empty"
        Case 1
            VarTypeName = "Null"
        Case 2
            VarTypeName = "Integer"
        Case 3
            VarTypeName = "Long"
        Case 4
            VarTypeName = "Single"
        Case 5
            VarTypeName = "Double"
        Case 6
            VarTypeName = "Currency"
        Case 7
            VarTypeName = "Date"
        Case 8
            VarTypeName = "String"
        Case 10
            VarTypeName = "Error"
        Case 9, 13
            VarTypeName = TypeName(v)
        Case 11
            VarTypeName = "Boolean"
        Case 12, 1, 36
            VarTypeName = "Variant"
        Case 14
            VarTypeName = "Decimal"
        Case 17
            VarTypeName = "Byte"
        Case 20
            VarTypeName = "Long Long"
        Case 8204
            VarTypeName = "Variant()"
        Case Is > 8000
        On Error GoTo 1000
            If UBound(v) > LBound(v) Then
                VarTypeName = VarTypeName(v(LBound(v))) + "()"
                If VarTypeName = "Nothing()" Then VarTypeName = "Object()"
               
            Else
1000        If Err.Number <> 0 Then Err.Clear
            VarTypeName = "Array"
            End If
           
        Case Else
            VarTypeName = "type" & VarType(v)
    End Select
End Function
Public Function HighLong(a) As Long
    HighLong = LowLong(cInt64(a) \ OneBigLongLong())
End Function
Public Function LowLong(ByVal p) As Long
    If Not myVarType(p, 20) Then p = cInt64(p)
    CopyMemory ByVal VarPtr(LowLong), ByVal VarPtr(p) + 8, 4
End Function
Function Hex64$(a, Optional showlong)
    Dim p, p1, sg As Integer
    a = cInt64(a)
    sg = Sgn(a)
    p = -OneLongLong() And a
    p1 = p \ OneBigLongLong()
    p1 = LowLong(p1)
    p = LowLong(p)
    If Not IsMissing(showlong) Then If showlong Then sg = Sgn(p)
   
    If p1 = 0 And sg = -1 Then
        Hex64$ = "FFFFFFFF" + Right$("0000000" + Hex$(p), 8)
    Else
        Hex64$ = Right$("0000000" + Hex$(p1), 8) + Right$("0000000" + Hex$(p), 8)
    End If
End Function
Public Function OneLongLong() As Variant
    Static p
    If p = Empty Then
        PutMem2 VarPtr(p), 20
        PutMem1 VarPtr(p) + 8, 1
    End If
    OneLongLong = p
End Function
Public Function OneBigLongLong() As Variant
    Static p
    If p = Empty Then
        PutMem2 VarPtr(p), 20
        PutMem1 VarPtr(p) + 12, 1
    End If
    OneBigLongLong = p
End Function
Public Function MaskLowLongLong() As Variant
    PutMem2 VarPtr(OneBigLongLong), 20
    PutMem4 VarPtr(OneBigLongLong) + 12, -1&
End Function
Public Function cInt64(p)
    Dim a
    Dim i As Integer
    GetMem2 VarPtr(p), i
    Select Case i
    Case vbDecimal
        a = Fix(p)
        If a < -limitlonglong - 1 Then
            While a <= -limitlonglong - 1: a = a + maxlonglong: Wend
        End If
        While a > limitlonglong: a = a - maxlonglong: Wend
        cInt64 = -OneLongLong() And a
    Case 20
        cInt64 = p
    Case vbLong, vbInteger
        cInt64 = -OneLongLong() And p
    Case Else
        a = Fix(CDec(p))
        If a <= -limitlonglong - 1 Then
            While a <= -limitlonglong - 1: a = a + maxlonglong: Wend
        End If
        While a > limitlonglong: a = a - maxlonglong: Wend
        cInt64 = -OneLongLong() And a
        If i = vbString Then
            If Left$(p, 1) = "&" And a < 0 Then
            If Len(p) = 10 Then
            If InStr("89ABCDEF", UCase(Mid$(p, 3, 1))) = 1 Then
            cInt64 = OneBigLongLong() + cInt64
            End If
            Else
            If InStr("89ABCDEF", UCase(Mid$(p, 3, 1))) = 0 Then
            cInt64 = OneBigLongLong() + cInt64
            End If
            End If
            End If
        End If
    End Select
End Function


Viewing all articles
Browse latest Browse all 1470

Trending Articles