2011-12-28 60 views
0

可能重复:
What does 'unsigned temp:3' means
what does this mean in c int a:16;?这个':'运算符在下面的C++代码中做了什么?为什么?

我碰到这个struct在一些C++代码,我的工作来了。有人可以向我解释冒号操作员正在做什么以及为什么会使用它?

struct MYMSG 
{ 
    unsigned short src : 4; 
    unsigned short dst : 11; 
    unsigned short tx : 1; 
}; 
+0

要分配的位数。 – cppcoder 2011-12-28 16:10:36

+0

那么,在内存中的16位中,src字段只会使用4个LSB?或者它只分配4位? – bporter 2011-12-28 16:12:40

+0

@bporter是src将只使用4位,但它可能不是4个LSB。编译器使用的布局因实现而异,没有标准。 – shf301 2011-12-28 16:15:07

回答

1

如上所述,它是每个字段使用的位数。

struct MYMSG 
{ 
    unsigned short src : 4; // allows values 0 - 15 
    unsigned short dst : 11; // allows values 0 - 2047 
    unsigned short tx : 1; // allows values 0 - 1 
}; 

如果关闭对齐,这也具有封装结构的效果。如果这个结构没有填充,那么调用sizeof()将返回2(在8位/字节的体系结构上)。

在这种情况下,分配一个unsigned short,并且位字段在该值内被分开。设置超出其中一个字段范围的值(如16src)将导致该特定字段溢出,但不会更改任何其他字段的值(dst的值不会更改)。

采取一种更钝例如:

struct T 
{ 
    unsigned long val : 4 
}; 

这仍然分配一个完整的unsigned long(在大多数架构32位),但只允许第一4位给人0有效值的设置 - 15

+0

好的后续问题,答案有点太复杂了,所以我已经更新了我的答案。 – Chad 2011-12-28 16:35:29

+0

感谢您的帮助。这清除了很多东西。 – bporter 2011-12-28 16:56:24