décalage de bits d’une valeur entière

Ce code est destiné à un projet de simulateur de cache. J’essaie d’extraire certains bits d’une adresse mémoire. Lorsque j’essaie d’utiliser des variables int pour effectuer le transfert de bits, le résultat obtenu est incorrect, mais lorsque j’utilise les nombres directement, mon résultat est correct. J’ai cherché partout une réponse à cela, mais je n’en trouve pas. Quel est mon problème ici?

#include  void main(){ unsigned long long int mem_addr = 0x7fff5a8487c0; int byte_offset_bits = 2; int block_offset_bits = 5; int index_bits = 8; int tag_bits = 33; unsigned long long int tag1 = (mem_addr&(((1<<33)-1)<>(2+5+8); unsigned long long int tag2 = (mem_addr&(((1<<tag_bits)-1)<>(byte_offset_bits + block_offset_bits + index_bits); printf("%s %llx\n", "Tag 1:", tag1); printf("%s %llx\n", "Tag 2:", tag2); } 

La sortie est:

 Tag 1: fffeb509 Tag 2: 1 

Je reçois également un avertissement pour la ligne qui calcule correctement tag1, ce qui n’a aucun sens pour moi, puisque tag1 est un entier long, long et non signé de 64 bits, et que je ne change que de 48 bits:

  warning: left shift count >= width of type [enabled by default] 

Merci d’avance pour l’aide.

Toutes les valeurs littérales entières sont de type int , sauf si vous spécifiez un préfixe tel que, par exemple, 1ULL .

Cela signifie que 1<<33 décale une valeur signée de 33 bits sur 33 pas. Vous devez faire 1ULL << 33 .

Je pense que le problème est le suivant: constante 1 correspond au type entier (4 octets 32 bits). Cependant, vous décalez 33 bits à gauche (dépassez le type entier), dans ce cas, convertissez 1 en int long long signé (8 octets = 64 bits) avant de décaler en gauche:

 #include  void main(){ unsigned long long int mem_addr = 0x7fff5a8487c0; int byte_offset_bits = 2; int block_offset_bits = 5; int index_bits = 8; int tag_bits = 33; unsigned long long int one = 1; unsigned long long int tag1 = (mem_addr&(((one<<33)-one)<<(2+5+8)))>>(2+5+8); unsigned long long int tag2 = (mem_addr&(((one<>(byte_offset_bits + block_offset_bits + index_bits); printf("%s %llx\n", "Tag 1:", tag1); printf("%s %llx\n", "Tag 2:", tag2);