【问题标题】:How to store a two's complement number in a long如何存储一个二进制补码长
【发布时间】:2014-09-16 04:01:13
【问题描述】:

我正在将一个 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;
}

【问题讨论】:

  • 这可能是您从 C 库中获取值的方式;尤其是如果这是来自 VB6 的端口
  • 我将使用 C 库中有关该函数的更多信息来更新我的问题。如果绝对必要,我可以更改 C 代码,但这确实不理想。
  • 你的 dllimport 函数是什么样的?您说得对,-180 和 4294967117 的位看起来相同——从 VB6 转换时,您是否忘记将 dllimport 声明从 long 更改为 integer
  • 可能返回的是 32 位数字,而不是 64 位。
  • @JuiCe 正如the_lotus 所说,该函数可能返回一个 32 位值。在 VB6 中,Long 是 32 位,但 VB.NET Long 是 64 位。 C 函数使用long,根据规范保证为“至少 32 位”。尝试将您的 dllimport 声明更改为 ByRef val As Integer 并查看它是否有效。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 2016-05-18
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多