2012-12-18 47 views
3

我有一個unsigned long long變量,它是我的系統上8個字節,我嘗試做以下上:左移錯誤

unsigned long long ull; 
ull = timeLow; 
ull |= timeHigh << 32; 

我得到的警告:類型的左移計數> =寬度當這樣做。此外,它似乎沒有考慮到時間高漲轉移。我該如何解決這個問題?

+0

爲什麼系統是這樣的(硬件/操作系統/編譯器)?任何不使用uint64_t的原因? – Michael

+0

嘗試'ull | = timeHigh << 32ull;'注意數字後綴。 –

+1

@ThomasMatthews:沒有幫助,因爲'<<'不執行通常的算術轉換;左操作數(在默認促銷後)必須足夠大。 – aschepler

回答

10

您沒有移動ull,您正在移動timeHigh,然後將該移位的結果存儲在ull中。

我懷疑timeHigh不足以存儲32位轉換的結果。使timeHighunsigned long long,(編輯)或者可選地僅將timeHigh分配給ull,然後在timeLow之前將or移位。 (credit @JasonD)

+2

或者只是先分配timeHigh給ull,然後在timeLow之前將其轉移。 – JasonD

0

timeHigh似乎是一個32位的類型。在移位32位後,它全部爲零。您必須在轉換之前將timeHigh轉換爲很長的類型。

unsigned long long ull; 
ull = timeHigh; 
ull = ull << 32; 
ull |= timeLow; 
+0

將32位無符號數左移32位會導致未定義行爲,不一定爲「全零」。 – aschepler

+0

我描述了在他的特殊情況下可能發生的事情,「它似乎沒有考慮到時間高漲」。你是對的,我應該提到這個標準。 – stefan

0

這是你的意思嗎?

unsigned long long timeLow = /* value */; 
unsigned long long timeHigh = /* value */; 
unsigned long long ull; 
ull = (timeHigh << 32 | timeLow)