C# int到浮点指针 在C++中,有一个浮点值被放入int: int value = *(int *)(&myFloatValue);

C# int到浮点指针 在C++中,有一个浮点值被放入int: int value = *(int *)(&myFloatValue);,c#,.net,pointers,unsafe,C#,.net,Pointers,Unsafe,这个值被传递给我正在用C#编写的程序。在运行时不知道该值是int类型还是float类型。我必须考虑两种选择。显然,如果它是int,我已经有了它。但是,如果它是一个浮点值,我需要更改它(而不是强制转换)它的浮点值。我该怎么做?我尝试在C#中使用指针,但没有成功。BitConverter.GetBytes和BitConverter.ToFloat()。如果我理解你的要求,我建议使用联合 [StructLayout(LayoutKind.Explicit)] struct IntOrFloat {

这个值被传递给我正在用C#编写的程序。在运行时不知道该值是int类型还是float类型。我必须考虑两种选择。显然,如果它是int,我已经有了它。但是,如果它是一个浮点值,我需要更改它(而不是强制转换)它的浮点值。我该怎么做?我尝试在C#中使用指针,但没有成功。

BitConverter.GetBytes
BitConverter.ToFloat()。
如果我理解你的要求,我建议使用联合

[StructLayout(LayoutKind.Explicit)]
struct IntOrFloat
{
    [FieldOffset(0)]
    public int asInt32;
    [FieldOffset(0)]
    public float asFloat;
}
我认为这会起作用。

一个选择是使用:

如果在调用该方法之前知道值的类型,那么可以做的另一件事是在p/Invoke端使用运算符重载:

// [DllImport("x.dll")]
// public static extern void YourCall(ref float value);

// [DllImport("x.dll")]
// public static extern void YourCall(ref int value);

if (someCondition)
{
    float value = 0.0f;
    NativeMethods.YourCall(ref value);
    this.frob(value);
}
else
{
    int value = 0;
    NativeMethods.YourCall(ref value);
    this.frob(value);
}
在C#代码中执行相反的操作:

这应该行得通

(只需确保该值不在托管类型内,它必须独立存在)


编辑:确保将正在执行此操作的代码体声明为“不安全”

您可以使用
位转换器,但它确实有点难看。你的C++到C接口非常混乱——传递一个值,它可以是同一个参数中的int或浮动。我建议您执行以下两种操作之一:

  • 传递一个int和一个float,并决定C中哪个是正确的#
  • 只传递一个数字,该类型可以容纳所有浮点数和所有整数-
    double

  • 哦,是的,我也喜欢+11) 你怎么能在运行时不知道类型呢?2) 你说的“改变”是指重新诠释演员阵容?我真的不明白?如何传递值?通过方法调用?这种方法有原型吗?
    // [DllImport("x.dll")]
    // public static extern void YourCall(ref float value);
    
    // [DllImport("x.dll")]
    // public static extern void YourCall(ref int value);
    
    if (someCondition)
    {
        float value = 0.0f;
        NativeMethods.YourCall(ref value);
        this.frob(value);
    }
    else
    {
        int value = 0;
        NativeMethods.YourCall(ref value);
        this.frob(value);
    }
    
    float myFloatValue = *(float *)(&value);