为什么这个结构的显式布局不按我的想法行事?

时间:2014-04-01 21:19:35

标签: c# struct hex endianness unions

首先,对于模糊的标题感到抱歉,但我无法想到更好的标题。

基本上,我有一个结构定义如下:

[StructLayout(LayoutKind.Explicit)]
public struct SinkHead {
    [FieldOffset(0)]
    public long AsLong;

    [FieldOffset(1)]
    public bool UseSink1;

    [FieldOffset(4)]
    public int LastSinkSlot;
}

稍后,我有以下代码:

private const long INITIAL_VALUE_SINK1_HEAD = 0x00FF0000FFFFFFFFL;
private SinkHead sinkHead = new SinkHead { AsLong = INITIAL_VALUE_SINK1_HEAD };

然后,我立即打印以下行:

Console.WriteLine(sinkHead.LastSinkSlot);

我希望看到-1,但我得到16711680(即0x00FF0000)。

我认为字段偏移量为4会将LastSinkSlot值设置为0xFFFFFFFF,对于带符号的32位int,该值为-1。

我的第一个想法是,这对于endianess来说有点麻烦,但是我肯定只是从相同的偏移量向后读取0xFFFFFFFF?或者,我希望看到0x0000FF00的值。

或者,也许FieldOffset并不是我所瘦的,但无论哪种方式我都无法得到它。

顺便说一句,将结构更改为这样可以使其正常工作:

[StructLayout(LayoutKind.Explicit)]
public struct SinkHead {
    [FieldOffset(0)]
    public long AsLong;

    [FieldOffset(6)]
    public bool UseSink1;

    [FieldOffset(0)]
    public int LastSinkSlot;
}

这让我想知道长时间是换成两半还是什么......但我不知道。

0 个答案:

没有答案