2015-04-07 40 views
-2

`C++使用聯合設置64位變量和讀取2個32位

union { 
    uint64_t entryid; 
    uint32_t entryid[2]; 
}; 

entryid = get64bitKey(); 

storeKeytodb(entryid[0],entryid[1]); 
......... 
getKeyFromDB(&entrid[0], &entryid[1]); 

`

你們是否看到任何問題與此如果設置/獲取存儲/讀取同一主機上(相同的字節順序)

是下面這樣

`

union { 
    uint64_t entryid; 
    struct { 
    uint32_t entryid1; 
    uint32_t entryid2; 
    }entry; 

}; 
更好的方法

`

+3

你的兩個例子做了完全不同的事情。在C++中都是非法的。 –

+0

完全是我的錯。寫了一個僞代碼來解決我的問題,並徹底搞砸了代碼。編輯代碼到我打算寫的 有人可以現在回答它 – theAlias

+0

啊共同點! -2表決不構成問題的權利 – theAlias

回答

3

做到這一點的方法很簡單:

uint64_t value = ... 
uint32_t highword = static_cast<uint32_t>(value >> 32); 
uint32_t lowword = static_cast<uint32_t>(value); 

的翻領(你並沒有明確要求,但你的代碼似乎暗示)是這樣的:

uint32_t highword = ... 
uint32_t lowword = ... 
uint64_t value = (static_cast<uint64_t>(highword) << 32) + lowword; 

請注意,在這裏,重要的是首先轉換高位字,然後轉換它。

+0

謝謝烏爾裏奇。出於好奇,我的第一種方法有什麼問題?除了排序 – theAlias

+0

Furstly,兩種'聯合'方法都不是必需的。那麼,你的方法都依賴於我認爲被明確標記爲「未定義行爲」的東西,因爲你只能從你寫給一個工會的成員讀取,而具有相同第一成員的結構除外。第二種方法進一步增加了結構成員與問題列表之間的可能填充。 –

+0

謝謝您提供我正在尋找的解釋 – theAlias