在我看來,你不太明白什麼是工會。一個工會的成員是重疊的價值(換句話說,一個Count
工會共享相同的空間三個成員)。
假設,只是爲了示範的目的,一個short
是16位(2個字節),一個float
爲32位(4個字節)和一個double
爲64位(8個字節),則聯合是在8個字節尺寸。在little-endian格式中,num
成員表示前2個字節,weight
成員表示前4個字節(包括num
的2個字節),捲成員表示全部8個字節(包括2個字節的num
和weight
的四個字節)。
最初,你的工會裝着垃圾,即一些未知的位模式,讓我們來顯示它像這樣(十六進制):
GG GG GG GG GG GG GG GG // GG stands for garbage, i.e. unknown bit patterns
如果設置num
爲2,則前兩個字節是0x02
0x00
,但其他字節仍然是垃圾:
02 00 GG GG GG GG GG GG
如果你讀weight
,你只是閱讀的前四個字節,解釋爲float
,所以float
包含字節
02 00 GG GG
由於浮點值有完全不同的格式整型像short
,你無法預測這些字節(即表示特定的位模式)。它們不代表浮點值2.0f,這可能是你想要的。實際上,一個float
的「更顯著」部分存儲在高位字節,即在weight
的「垃圾」的一部分,因此它幾乎可以是任何東西,包括一個NaN
,+infinity
,-infinity
等
同樣如果你讀volume
,你有一個double
一個由字節
02 00 GG GG GG GG GG GG
的,並且不一定代表2。0(儘管偶然,它可能會非常接近,如果巧合,正確的位被設置在正確的位置,並且如果低位在顯示這樣的值時被捨去)。
聯盟並不意味着要進行從int
到float
或double
的適當轉換。他們僅僅意味着能夠爲不同類型的值存儲到同一類型,並從另一成員閱讀爲你設置只是意味着你重新詮釋一些存在於工會的東西完全不同的位。你不是轉換。
那麼你如何轉換?這是很簡單的,不需要工會:如果通過「錯誤」的成員訪問聯合(即比它通過指定程序以外的其他成員),結果將依賴於語義
short num = 2;
float weight = num; // the compiler inserts code that performs a conversion to float
double volume = num; // the compiler inserts code that performs a conversion to double
不要指望未定義的行爲被定義。 – chris
您只能將該聯合的「short」部分設置爲某個值。其餘的將包含每次重新運行的隨機數據。 – usr2564301
那麼男孩假設要做什麼?只需選擇你蘋果的重量從空氣 –