2017-08-10 51 views
0

雖然試圖想出一個位板類的方案,我決定使用全局編譯時間變量來表示關鍵位板配置,例如。所有黑車的初始位置。移位時是否有n位限制?

constexpr uint64_t BLACK_ROOK_INIT = 0x1 | (0x1 << 56); 

但是我收到編譯器錯誤。編譯器似乎將此值視爲32位值並進行類型轉換,或者添加其他0似乎沒有什麼區別。類型定義來自。

只要我從這個表達式中刪除constexp就會編譯,但是仍然會產生相應的警告。這是爲什麼發生?我認爲這可能是預處理器的限制,但問題仍然存在,無需constexp。

chess.cpp:16:64: error: right operand of shift expression ‘(1 << 56)’ is >= than the precision of the left operand [-fpermissive] 

僅供參考,這也不會編譯

constexpr int64_t BLACK_ROOK_INIT = (int64_t)0x1 | (int64_t)(0x1 << 32); 
+1

'1' *是一個'int'。你可以使用'uint64_t(1)'來獲得更大的值。 –

+0

這仍然不能編譯。我會在上面添加來演示。 – mreff555

+2

1是int。 *轉換後,轉換爲int64_t發生*。你想要1LL。 – deviantfan

回答

2

這是你想要什麼:

#include <iostream> 

int main(){ 
    constexpr uint64_t BLACK_ROOK_INIT = 0x1ULL | (0x1ULL << 56); 
    std::cout<<BLACK_ROOK_INIT<<std::endl; 
} 

0x1值,默認情況下,一個int,通常是爲實現一個32位整數。

後綴討論here。如果他們讓你有點不舒服,像他們一樣,你可以投射如下:

#include <iostream> 

int main(){ 
    constexpr uint64_t BLACK_ROOK_INIT = (uint64_t)(0x1) | ((uint64_t)(0x1) << 56); 
    std::cout<<BLACK_ROOK_INIT<<std::endl; 
}