如何在VB6中表示64位整数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在VB6中表示64位整数?相关的知识,希望对你有一定的参考价值。
我不得不扩充遗留应用程序来处理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)中读取它们,然后将其显示到表单。
您可以将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位,因此您不会在服务器端获得“溢出”:)
ADO Field.Value是Variant类型。当您在VB6中检索adBigInt时,Variant将为子类型Decimal。
答案是,这取决于你将如何处理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可能会导致您的程序失败。
以上是关于如何在VB6中表示64位整数?的主要内容,如果未能解决你的问题,请参考以下文章