2016-02-25 199 views
0

在c程序中。我正在嘗試在uint64_t變量上使用左移運算符。無符號long long型按位移

E.g.

// with shift of 24 bits 
    uint64_t x = 0; 
    x = (((uint64_t)76) << (24)); 
    Output is: x = 1275068416 
    --------------------------------------------- 
    // with shift of 32 bits 
    uint64_t x = 0; 
    x = (((uint64_t)76) << (32)); 
    Output is: x = 0 

如果我執行左移,直到24位,然後它工作得很好,但在32位則輸出0而我認爲是作爲uint64_t中即無符號長長是64位的大小。所以,它應該不會工作,直到64位的轉變?

+2

你用什麼構造來檢查'x'的值? – ach

+0

我只是使用printf printf(「....%d \ n」,x)打印出x的值; – TechJ

+2

QED,那麼..'%d'正在爲'int'工作。使用「'%llu'」 –

回答

2

您正在使用錯誤的格式說明符來打印輸出。格式說明符%d需要int,這在系統上顯然是32位的。因此傳遞一個64位值(以及一個未簽名的值)會導致未定義的行爲。

您應該使用PRIu64宏爲無符號的64位值獲取正確的格式說明符。

printf("%"PRIu64"\n", x); 
+0

'%lu'僅爲'unsigned long'保留。在通常爲32位的Windows機器上。 – ach

+0

@AndreyChernyakhovskiy謝謝。編輯應用。 – dbush