我已经在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。
有人可以解释它的工作原理吗?

最佳答案

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

所以这里没什么特别的。
不便之处,敬请原谅。

10-02 02:06