我想它在一個uint64_t中移動0xFF的3個字節的左,存儲,這應該是這樣工作的:爲什麼將0xff左移24位會導致錯誤的值(C++)?
uint64_t temp = 0xff << 24;
這就產生了0xffffffffff000000
的值是最肯定不是預期的0xff000000
。
但是,如果我移動它少於3個字節,它會導致正確的答案。
此外,嘗試將0x01左移3個字節確實有效。
這裏是我的輸出: 0xff shifted by 0 bytes: 0xff 0x01 shifted by 0 bytes: 0x1 0xff shifted by 1 bytes: 0xff00 0x01 shifted by 1 bytes: 0x100 0xff shifted by 2 bytes: 0xff0000 0x01 shifted by 2 bytes: 0x10000 0xff shifted by 3 bytes: 0xffffffffff000000 0x01 shifted by 3 bytes: 0x1000000
有了一些實驗,左移工作到3位爲每uint64_t中達到0x7f,這將產生0x7f000000。 0x80產生0xffffffff80000000。
有沒有人有這種奇怪的行爲的解釋? 0xff000000肯定落在uint64_t的2^64-1範圍內。
'0xff'是一個'int',它通常是一個32位整數。所以'0xff << 24'在32位整數上進行數學運算,而不是在'uint64_t'上。所以最左邊的'1'位被當作符號位來處理,所以當我們將寬度擴展到64位整數時,我們將所有新位設置爲'1',當我們轉換成所有'f'時一個無符號整數 – Justin
「奇怪」,如「我不明白它」?這種行爲的原因是所有這些常量都具有類型「int」。爲了得到你要查找的行爲,要麼確保它們是64位寬,要麼將它們明確寫爲無符號long long值(例如0xffULL),要麼將其轉換爲'std :: uint64_t'。 –
嘗試'uint64_t temp = 0xffu << 24;'或'uint64_t temp = 0xfful << 24;' – gurka