2017-09-13 62 views
0

我有以下代碼。我們的目標是將兩個uint32_t小號組合成一個單一的uint64_t,然後檢索值。爲什麼我不能將這些內容整理在一起?

#include <iostream> 
#include <cstdint> 

int main() 
{ 
    uint32_t first = 5; 
    uint32_t second = 6; 

    uint64_t combined = (first << 32) | second; 

    uint32_t firstR = combined >> 32; 
    uint32_t secondR = combined & 0xffffffff; 

    std::cout << "F: " << firstR << " S: " << secondR << std::endl; 
} 

它輸出

F: 0 S: 7 

如何成功找回正確的價值觀?

+1

你應該嘗試使用一個編譯器,它自己檢測你的編程錯誤,並且責罵你:'warning:left shift count> = type [-Wshift-count-overflow]'的寬度'。當然,這將是gcc。你的'int'是32位,因此你的左移操作在32位值上運行,並溢出。在移動之前,將'first'明確地強制轉換爲'uint64_t'。然後切換到gcc,這是整個宇宙中最好的編譯器,而不僅僅是這個世界。 –

回答

1

當執行first << 32,你正在轉移32位的32位的空間內,所以有移位後剩餘的位。移位的結果是0。你需要將first值轉換爲64位,你可以快步前:

uint64_t combined = (uint64_t(first) << 32) | second; 
2

first是一個32位的類型和由32位你位移位它。這在技術上是未定義的行爲,但可能最可能的結果是該表達式的結果爲0.您需要在對它進行位移之前將其轉換爲更大的類型。

uint64_t combined = (static_cast<uint64_t>(first) << 32) | second; 
+0

Upvoting此答案而不是其餘兩個,因爲使用'static_cast <>'而不是C風格的強制轉換 – Fureeish

0

按照評論:

#include <iostream> 
#include <cstdint> 

int main() 
{ 
    uint32_t first = 5; 
    uint32_t second = 6; 

    uint64_t combined = (uint64_t(first) << 32) | second; 

    uint32_t firstR = combined >> 32; 
    uint32_t secondR = combined & 0xffffffff; 

    std::cout << "F: " << firstR << " S: " << secondR << std::endl; 
} 

位處理運算符返回一個類型的第一個參數。所以,你需要將其轉換爲uint64_t,以便它有餘地second值。

相關問題