用于访问无符号整数的字节/字的C ++类

时间:2009-09-27 16:56:40

标签: c++ low-level

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。

5 个答案:

答案 0 :(得分: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名称。

答案 1 :(得分:2)

C ++

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

普通C版本看起来像这样:

int32 foo;

//...

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

这可能比编写自定义类/联合更容易维护,因为它遵循典型的C语言。

答案 2 :(得分: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 ++中已知的属性仿真。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

为此使用联合是不好的,因为它不是便携式的w.r.t.端标记。

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