【问题标题】:4-bit Enum in C#C# 中的 4 位枚举
【发布时间】:2011-04-26 16:33:47
【问题描述】:

我知道可以使用 (:ulong, :uint, :ushort, :byte) 制作使用有符号或无符号 64、32、16 和 8 位值作为其基础值类型的枚举。但是是否可以创建一个 4 位枚举?

(我正在编写一些将与 C++ 互操作的代码,并且我在 C# 中用于返回类型的结构具有一个最自然的字段作为 4 位结构。)

【问题讨论】:

  • 我认为您的处理器无论如何都找不到自然的 4 位值。
  • 不会像这样的东西被填充到更大的宽度还是我走远了?
  • @Chaos:你没看错。英特尔“自然”的最小尺寸是 8 位。 Michael 想要的是可能的,但最好将两个有限范围的 8 位枚举组合在一起。

标签: c# interop struct pinvoke


【解决方案1】:

来自 C# 规范:

枚举的批准类型是 byte, sbyte, short, ushort, intuintlongulong

这些都不是 4 位类型。您在 C++ 方面也会遇到同样的问题。

【讨论】:

  • C++ 有位域。你可以说一个结构字段使用了多少位。
  • 是的,在 C++ 方面,只需在结构中执行“:4”,然后#define 16 个可能的值。在 C# 端很容易将其中两个 :4 值合并到一个字节中。但是接下来我必须分别查看它的低 4 位和高 4 位。
【解决方案2】:

但是是否可以创建一个 4 位枚举?

不,主要是因为那会很尴尬而且很慢。并且在语法上不存在指定为基本类型的 4 位类型。

使用 C++ 和我在 C# 中用于返回类型的结构有一个字段,作为 4 位结构是最自然的。

我非常怀疑 C++ 是否可以处理位字段,但这非常有效(可能在空间中除外)。

与 C++ 的互操作已经够难了,当返回类型是你的选择时,不要让它变得比它必须的更难。

【讨论】:

  • 为什么 4 位有符号和无符号值类型比 8 位或 16 位类型或多或少笨拙和慢?两者都小于机器的内存大小(32 位或 64 位)。
  • 另外,这里很自然,因为在 C++ 中,它们有一个 UInt8,它们使​​用 :4 语法分为两个 4 位字段。两者都表示 X 和 Y 的 16 种可能状态。在我的 C# 结构中,我希望有两个 4 位字段表示 X 和 Y 的状态。相反,我必须有一个表示状态的 UInt8(字节)字段X 和 Y 在一起。
  • @Michael,字节是大多数硬件上最小的可寻址单元,并且与本机 32/64 位字一样快。对于 4 位,编译器必须插入额外的屏蔽操作。
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多