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。
答案 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;
};
};
请注意已移除的bytes
和words
名称。
答案 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.端标记。
使用访问器功能并使用位掩码和移位来实现它们。