2017-08-10 2 views
0

En essayant de trouver un schéma pour une classe de bitrate, j'ai décidé d'utiliser des variables de temps de compilation globales pour représenter les configurations de cartes de bits clés, ex. la position initiale de toutes les tours noires.Existe-t-il une limite de n bits lors du décalage de bit?

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

Cependant, je reçois des erreurs de compilation. Le compilateur semble traiter cette valeur comme une valeur de 32 bits et le lancement de type ou l'ajout de 0 supplémentaires ne semble pas faire de différence. La définition de type provient de.

Dès que je supprime constexp de cette expression, il compile, mais produit toujours l'avertissement équivalent. Pourquoi cela arrive-t-il? Je pensais que ce pourrait être une limitation du pré-processeur, mais le problème persiste sans constexp.

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

Pour votre information, cela aussi ne compile pas

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

'1' * est un 'int'. Vous pouvez utiliser 'uint64_t (1)' pour obtenir une valeur plus large. –

+0

Cela ne compile toujours pas. Je vais ajouter ci-dessus pour démontrer. – mreff555

+2

1 est int. La conversion en int64_t arrive * après * le décalage. Tu veux 1LL. – deviantfan

Répondre

2

Voici ce que vous voulez:

#include <iostream> 

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

Votre valeur 0x1 est, par défaut, un int, qui est habituellement mis en œuvre un entier de 32 bits.

Les suffixes sont décrits here. S'ils vous rendent un peu mal à l'aise, comme ils le font moi-même, vous pouvez lancer comme suit:

#include <iostream> 

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