2011-12-28 90 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