如何在VB6中表示64位整数?

问题描述 投票:5回答:3

我不得不扩充遗留应用程序来处理64位整数。但是,VB6没有这种数据类型。我发现在线的推荐是使用货币数据类型。

但是,我发现我遇到了一些溢出问题。

示例 - CCur调用期间溢出的结果:

dim c as currency

' set maximum value of int64
c = CCur("9223372036854775807")

但是,如果我应用较小的数字(但仍然比int32大得多),它确实有效:

dim c as currency

' Remove the last 4 digits
c = CCur("922337203685477")

那我在这里错过了什么?如何处理64位值?

我需要对64位值执行的唯一操作是从SQL Server存储过程(它来自sql类型bigint)中读取它们,然后将其显示到表单。

vb6
3个回答
1
投票

您可以将Variant数据类型与CDec()转换一起使用。

dim c as variant

' set maximum value of int64
c = CDec("9223372036854775807")

现在你甚至可以在c上使用标准的vb6数学运算或字符串转换函数。

Dim c As Variant, d As Variant

c = CDec("9223372036854775807")

Dim i As Integer

i = 1000
d = 10

Debug.Print c + i
Debug.Print c / d
Debug.Print CStr(c)

结果

 9223372036854776807 
 922337203685477580,7 
9223372036854775807

请注意,Decimal类型Variant宽于64位,因此您不会在服务器端获得“溢出”:)


4
投票

ADO Field.Value是Variant类型。当您在VB6中检索adBigInt时,Variant将为子类型Decimal。


1
投票

答案是,这取决于你将如何处理64位值。如果您只想保留一个值而不对其进行任何算术,那么创建一个字节数组或长数组可能会更好。例如:

Dim SixtFourBit(7) As Byte

要么

Dim SixtyFourBit(1) As Long

使用货币类型是一种更简单的解决方案,因为您可以对其应用算术。但Currency类型是固定格式表示,总是有四个小数位。这意味着64位表示的低字节构成了Currency值的小数部分(排序)。

要在Currency和数组之间强制使用Devilish CopyMemory windows API函数:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Integer)

Sub SomeFunction()
    Dim AnArray(7) As Byte
    Dim ACurrency as Currency

    ACurrency = 123.4567
    CopyMemory AnArray(0), VarPtr(ACurrency), 8&

    ' Inspecting AnArray in the watch window will show you the byte representation of ACurrency
End Sub

需要注意的是,通常要避免这种诡计。不正确使用CopyMemory可能会导致您的程序失败。

© www.soinside.com 2019 - 2024. All rights reserved.