2016-11-07 3 views
4

Мне нужно увеличить устаревшее приложение для обработки 64-битных целых чисел. Однако для VB6 для этого нет типа данных. Рекомендация онлайн, которую я нашел, заключается в использовании типа данных валюты.Как представить 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 type bigint), а затем отобразить ее в форме.

+2

Вы первым примером должен быть 'c = CCur (" 922337203685477.5807 ")'. См. [This] (http://stackoverflow.com/questions/1253311/vb-datatypes-size). –

ответ

1

Вы можете использовать тип данных Variant с преобразованием CDec().

dim c as variant 

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

Теперь вы можете использовать стандартные математические операции vb6 или функции преобразования строк в c.

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 

Просто надо знать, что десятичный тип Variant шире, чем 64 бит, так что вы не получите «Переполнение» на стороне сервера :)

4

ADO Field.Value тип Variant. Когда вы извлекаете adBigInt в VB6, Вариант будет иметь подтип Decimal.

1

Ответ: это зависит от того, что вы собираетесь делать с 64-битным значением. Если вы просто хотите сохранить значение без какой-либо арифметики, то может быть лучше создать массив байтов или длинный массив. Например:

Dim SixtFourBit(7) As Byte 

или

Dim SixtyFourBit(1) As Long 

Используя тип валюты является более простым решением, так как вы можете применить арифметику к нему. Но тип валюты представляет собой фиксированное представление формата, всегда имеющее четыре знака после запятой. Это означает, что нижние байты 64-битного представления будут составлять дробную часть значения Currency (сорт).

Чтобы принуждать между Currency и массивы используют дьявольский функцию CopyMemory окна 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 может убить вашу программу.