2015-11-04 54 views
2

我有關於Union的以下程序。我沒有真正與很多人合作過,但從我所瞭解的Union的元素共享相同的內存空間。此外,當我第一次看着我的老師幻燈片時,我以爲這是某種東西similarstructs但沒有。無論如何,所以我試圖打印一個Union價值,但我不明白。有人可以告訴我爲什麼它只打印1並忽略前5個字符?第二個問題; 有沒有一種方法來計算a ^= b;沒有轉換ab二進制?這是一箇中期練習的問題,我認爲可能有更快的方法來解決,因爲它是一門課程,而不是數字系統課程。在C++中使用聯合和hexa

// Example program 
#include <iostream> 
#include <string> 

union Combi { 
int i; 
short s; 
}; 


int main() 
{ 
unsigned int a = 0xFF, b= 0x0F0F; 
a ^= b; 

Combi c; 
c.i = 0xFF0001; 
std::cout << c.s<<" "<<a; 

} 

回答

1

輸出聯合是一個數據結構,其中the data can be viewed different ways。編譯器提供了足夠的內存以便c存儲其最長的條目。當您將0xFF0001分配到c.i時,也會分配c.s,因爲它們重疊。當您告訴它打印c.s時,它將打印內存,但假定您只想看到short。這就是爲什麼你只看到1而不是其他角色。

第二個問題;有沒有一種方法來計算a ^= b;沒有將二進制文件轉換爲ab

是的;實際上,這就是程序所做的(這是十六進制格式,而不是二進制)。只要指定相應的十進制值,如果你願意,並且a ^= b將以完全相同的方式工作。以二進制或十六進制格式編寫它只是使它更易於閱讀。

+0

謝謝。對不起,我不太熟悉'decimalwise'與'decimal'的用法。你能舉一個簡單的解釋來舉個例子嗎?就像我看到'F^F'是'0',我想結果會是'F',就像'1^1'給出'1'一樣。 – Bobby

+1

既然'^'是按位異或運算符,'F^F == 0'是正確的。同樣,'1^1 == 0'是你應該得到的,這就是我的系統實際提供的(OS X Yosemite w/clang)。如果你的系統給出了'1^1 == 1'這是一個錯誤。同樣'15^15 == 0'和'15^7 == 8',都是正確的並且不使用二進制符號。按位和運算符是'&',位運算符是'|'。 –

+0

謝謝,不知道爲什麼我認爲它是'and' -__- – Bobby

2

我相信short表示持有的位數少於顯示FF所需的位數。把它想象成一個0xffff掩碼,因此隱藏所有高於此的位。

編輯:好的,在更深入的情況下,int和short共享內存中的相同位置。但是當你指定格式時,你會得到這種格式的內存數據(在內存中,無論如何它只是一堆比特)。

所以整個聯盟只佔用最大組件的大小;在這種情況下int。

假裝它從0x00000000開始。

然後,您將int(整個內存段)設置爲0xFF0001。

現在看起來像0x00FF0001。

現在你想打印出短的數據,但通常只有一個短的看起來像0x0000。所以在這種情況下,我們忽略上半部分0x00FF,而我們的短小部分是剩餘部分:0x0001。

因此,你得到的1