3

我已经在 c# 中实现了 c++ 联合,只是为了验证我理解它。但似乎我什么都不懂。我有时会期待完全不同的输出。我的代码:

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication2
{
[StructLayout(LayoutKind.Explicit)]
class union
{
    [FieldOffset(0)]
    public double d;
    [FieldOffset(0)]
    public float f0;
    [FieldOffset(4)]
    public float f1;
    [FieldOffset(0)]
    public int i0;
    [FieldOffset(4)]
    public int i1;
    [FieldOffset(0)]
    public short s0;
    [FieldOffset(2)]
    public short s1;
    [FieldOffset(4)]
    public short s2;
    [FieldOffset(6)]
    public short s3;

}

class Program
{
    static void Main(string[] args)
    {
        union su = new union();
        su.f0 = 19.012012F;
        su.f1 = 3.14159265F;
        Console.WriteLine(su.d);
        Console.WriteLine(su.i0);
        Console.WriteLine(su.i1);
        Console.WriteLine(su.s0);
        Console.WriteLine(su.s1);
        Console.WriteLine(su.s2);
        Console.WriteLine(su.s3);
        Console.ReadLine();
    }
}
} 

我的输出是:

  • 50,1238786690385
  • 1100486810
  • 1078530011
  • 6298
  • 16792
  • 4059
  • 16457

例如,我认为 s0 是​​ 30209 而不是 6298。有人能解释一下它是如何工作的吗?

4

2 回答 2

1

愚蠢的我,已经知道答案,但无法做基本的数学。这真的很简单。在 IEEE 754 中翻译你的浮点数。然后检查你的偏移量(以字节为单位),这是你的起点。确保您知道类型的长度(以位为单位或以字节为单位更好)。然后像以前学到的那样解决您的号码。
例如:
f0 的最后 16 位(小数)是: 0001 1000(字节 1) 1001 1010(字节 0)
s0 是​​一个短整数,因此它的大小为 16 位或 2 字节。现在开始通过从 LSB 开始解析 s0 为:
2 + 8 + 16 + 128 + 2048 + 4096 = 6298

所以这里没什么特别的。
对于给您带来的不便,我真的很抱歉。

于 2013-06-18T06:22:08.117 回答
0

我认为您可能需要struct使用class. 这里还有更多内容:C# 中的有区别的联合

于 2013-06-17T19:09:29.153 回答