C# 为什么这个结构';我怎么想的?

C# 为什么这个结构';我怎么想的?,c#,struct,hex,endianness,unions,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; } 稍

首先,很抱歉这个模糊的标题,但我想不出更好的了

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

[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
值设置为0xffffff,对于有符号的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;
}

这让我想知道是把长条换成两半还是什么。。。但是我不知道。

您是否也尝试在
StructLayout
属性上指定了?我自己还没有测试过。我相信一切都按预期进行。你的问题是什么?x86/x64是否使用little endian?是的。@Dmitry我希望从长“0x00ff0000ffffffffffff”的第四个字节捕获的int为“0xFFFFFFFF”-这是错误的吗?这是错误的,因为:
作为示例,英特尔x86处理器代表一种常见的小端结构