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 は 6298 ではなく 30209 になると思いました。

4

2 に答える 2

1

愚かな私は、答えを知っていましたが、基本的な数学を行うことができませんでした. それは本当に簡単です。float を IEEE 754 に変換します。次に、開始点であるオフセット (バイト単位) を確認します。型の長さをビット単位またはバイト単位で確認してください。次に、以前に学んだように番号を解決します。
例:
f0 の最後の 16 ビット (分数) は次のとおり
です。
LSB から2 + 8 + 16 + 128 + 2048 + 4096 = 6298になるように s0 の解決を開始します。

ここでは特別なことは何もありません。
ご不便をおかけして誠に申し訳ございません。

于 2013-06-18T06:22:08.117 に答える
0

struct以外を使用する必要があるかもしれないと思いますclass。ここにもっと何かがあります: C# の判別共用体

于 2013-06-17T19:09:29.153 に答える