如何在长时间内存储两个补码

时间:2014-07-24 14:25:00

标签: vb.net type-conversion twos-complement

我正在将VB6应用程序转换为VB.net。该应用程序使用我无法更改的现有C库。

问题:我期待-180180附近的值。我期待的时间180,它的工作原理。但是当我期待-180时,我会得到值4294967117。这似乎是C库正在返回2的补码,但我不知道如何对待它。

这是 VB6 代码:

Dim tmp As Long

If GetVal(VAL_A1, tmp) = ERR_VAL_NA Then
    lblAngle(0).Caption = "na"
Else
    lblAngle(0).Caption = tmp
End If

这是 VB.net 代码不起作用:

    If GetVal(VAL_A1, tmp) = ERR_VAL_NA Then
        txtBoxPhaseAngle1.Text = "na"
    Else
        txtBoxPhaseAngle1.Text = Convert.ToDouble(tmp)
    End If

我也尝试过:

 txtBoxPhaseAngle1.Text = Convert.ToInt32(tmp)

txtBoxPhaseAngle1.Text = tmp

编辑:

我如何声明C函数:

 Declare Function GetVal Lib "Z:\Devel\RelayAPI\Debug\RelayAPI.dll" (ByVal what As 
Integer, ByRef val As Long) As Byte

C代码中GetVal函数的片段:

BYTE __stdcall GetVal(WORD what, long *val){
    DWORD relaydate;
    BYTE tmpb;
    DWORD tmpd;
    long tmp;

    ...

        switch(what){

            case VAL_A1:
                tmpb=RelayAPI_Scaled;
                if(tmpd<6){
                    *val=(short)((WORD)mon[38]+((WORD)mon[39]<<8));
                }else{
                    *val=(short)((WORD)mon[32]+((WORD)mon[33]<<8));
                }
            break;

   break;
}

1 个答案:

答案 0 :(得分:2)

从VB6升级时,您需要注意某些数据类型已更改。在VB6中,Integer是16位,Long是32位。但是,在VB.NET中,Integer为32位,Long为64位。

在C函数中,您有long *val,而C long是&#34;至少32位&#34;根据规范,所以可能你的C函数返回一个32位整数。但是,VB.NET现在认为它是Long(64位)值,并将其解释为 - 4294967117而不是-180

如果将val参数的VB.NET声明更改为ByRef val As Integer,则可能会看到正确的返回值。