首先,对于模糊的标题感到抱歉,但我无法想到更好的标题。
基本上,我有一个结构定义如下:
[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;
}
这让我想知道长时间是换成两半还是什么......但我不知道。