2016-11-07 8 views
4

64ビット整数を処理するために従来のアプリケーションを増やす必要があります。ただし、VB6にはデータ型がありません。私が見つけた推奨のオンラインは、通貨データタイプを使用することでした。VB6で64ビット整数を表現する方法は?

しかし、私はいくつかのオーバーフローの問題に遭遇していることがわかりました。

例 - CCur通話中のオーバーフローでの結果:私は小さい数値を適用する(まだはるかに大きいINT32以上)場合

dim c as currency 

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

しかし、それがない作品:

dim c as currency 

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

だから何私はここで行方不明ですか? 64ビット値はどのように処理できますか?

64ビット値で行う必要があるのは、SQL Serverストアドプロシージャ(SQL型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演算や文字列変換関数を使用することもできます。

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 

あなたはサーバー側で「オーバーフロー」を得ることはありませんので、ちょうど、小数点型バリアントは、64ビットよりも広くなっていることに注意してください:)

4

ADO Field.ValueはVariant型です。 VB6でadBigIntを取得すると、VariantはサブタイプDecimalになります。

1

答えは、64ビット値で何をするかによって決まります。算術演算を行わずに値を保持したいのであれば、バイト配列またはロング配列を作成するほうが良いでしょう。たとえば:通貨の種類を使用して

Dim SixtFourBit(7) As Byte 

または

Dim SixtyFourBit(1) As Long 

は、あなたがそれに算術演算を適用することができますので、簡単なソリューションです。しかし、通貨タイプは固定フォーマット表現であり、常に小数点以下4桁を持ちます。これは、64ビット表現の下位バイトが通貨値の小数部分を構成することを意味します(並べ替え)。詐欺のこの種は、一般的に避けるべきであることを警告、と

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のWindows API関数を使用します。 CopyMemoryを誤って使用すると、プログラムが終了する可能性があります。

関連する問題