0
union LowLevelNumber
{
 unsigned int n;
 struct
 {
  unsigned int lowByte : 8;
  unsigned int highByte : 8;
  unsigned int upperLowByte : 8;
  unsigned int upperHighByte : 8;
 } bytes;
 struct
 {
  unsigned int lowWord : 16;
  unsigned int highWord : 16;
 } words;     
};

这个联合允许我访问无符号整数字节或逐字。但是,代码看起来相当难看:

var.words.lowWord = 0x66;

有没有一种方法可以让我编写这样的代码:

var.lowWord = 0x66;

更新:
这实际上是关于编写简短/漂亮的代码,如上例所示。联合解决方案本身确实有效,我只是不想每次访问 lowWord 或 lowByte 时都写 .words 或 .bytes。

4

5 回答 5

6
union LowLevelNumber {
    unsigned int n;
    struct {
        unsigned int lowByte : 8;
        unsigned int highByte : 8;
        unsigned int upperLowByte : 8;
        unsigned int upperHighByte : 8;
    };
    struct {
        unsigned int lowWord : 16;
        unsigned int highWord : 16;
    };
};

注意删除的byteswords名称。

于 2009-09-27T17:06:06.630 回答
2

C++

http://www.cplusplus.com/reference/stl/bitset/会满足您的需求吗?

纯 C 版本看起来像这样:

int32 foo;

//...

//Set to 0x66 at the low byte
foo &= 0xffffff00;
foo |= 0x66;

这可能比编写自定义类/联合更易于维护,因为它遵循典型的 C 习惯用法。

于 2009-09-27T17:02:26.030 回答
2

你(们)能做到

short& loword() { return (short&)(*(void*)&m_source); }

如果您不关心括号,请使用它。

或者你可以去花哨

public class lowordaccess
{
   unsigned int m_source;
public:
   void assign(unsigned int& source) { m_source = source; }
   short& operator=(short& value) { ... set m_source }
   operator short() { return m_source & 0xFF; }
}

接着

struct LowLevelNumber
{
   LowLevelNumber() { loword.assign(number); }

   unsigned int number;
   lowordaccess loword;
}
var.loword = 1;
short n = var.loword;

后一种技术是 C++ 中已知的属性模拟。

于 2009-09-27T17:07:13.863 回答
0

您可以轻松地将其包装在一个类中并使用 get/set 访问器。

于 2009-09-27T17:01:33.360 回答
0

为此使用联合是不好的,因为它不是可移植的字节顺序。

使用访问器函数并使用位掩码和移位来实现它们。

于 2009-09-27T18:07:30.387 回答