2013-01-13 67 views
2

在下面的代碼位域操作

#include <iostream> 

using namespace std; 
struct field 
{ 
    unsigned first : 5; 
    unsigned second : 9; 
}; 
int main() 
{ 
    union 
    { 
     field word; 
     int i; 
    }; 
    i = 0; 
    cout<<"First is : "<<word.first<<" Second is : "<<word.second<<" I is "<<i<<"\n"; 
    word.first = 2; 
    cout<<"First is : "<<word.first<<" Second is : "<<word.second<<" I is "<<i<<"\n"; 
    return 0; 
} 

當我初始化word.first = 2,如預期它更新字的5比特,並給出了期望的輸出。這是'我'的輸出有點混亂。當word.first = 2時,我給出的輸出爲2,當我做word.second = 2時,對於i的輸出是64.因爲它們共享相同的存儲器塊,所以在後一種情況下輸出(對於i) 2?

回答

7

這個特殊的結果是特定於平臺的;你應該閱讀endianness

但回答你的問題,不,word.firstword.second不共享內存;他們佔用不同的位。顯然,您的平臺上的底層表示是這樣的:

bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 
    |  |   second   | first  | 
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 
    |<------------------- i ----------------------->| 

所以設定word.second = 2套位#6的i,和2 = 64

+0

我的意思是一個字和「I」共享內存塊 –

+0

是的,但是'word.first'和'word.second'字使用不同的位。 –

+0

@oli我正在尋找的解釋。萬分感謝! –

1

雖然這取決於您的平臺和具體上都編譯器,這是你的情況下會發生什麼:

工會覆蓋兩個INT和結構上相同的內存。現在讓我們假設你的int大小爲32位。這又取決於多種因素。你的內存佈局將是這個樣子:

 
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 
        SSSSSSSSSFFFFF 

哪裏代表整數,小號第二場和˚F您結構的第一個字段。請注意,我代表了左邊最重要的位。

當初始化整爲零,所有的位被設置成零,因此第一和第二也爲零。 當你word.first設置爲2,內存佈局變爲:

 
00000000000000000000000000000010 
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 
        SSSSSSSSSFFFFF 

偉馳導致對整數值爲2。但是,通過將word.second的值設置爲2,內存佈局變爲:

 
00000000000000000000000001000000 
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 
        SSSSSSSSSFFFFF 

它給出的整數值爲64。