web-dev-qa-db-fra.com

"Utilisation d'un opérande entier signé avec un opérateur binaire au niveau des bits" - en cas d'utilisation de short non signé

Dans l'extrait C suivant, qui vérifie si les deux premiers bits d'une séquence de 16 bits sont définis:

bool is_pointer(unsigned short int sequence) {
  return (sequence >> 14) == 3;
}

Clang-Tidy de CLion me donne l'avertissement "Utilisation d'un opérande entier signé avec un opérateur binaire binaire", et je ne comprends pas pourquoi. Est unsigned short pas assez signé?

27
SakoDaemon

Le code pour cette vérification semble s'inquiéter si l'un des opérandes de l'opérateur au niveau du bit est signé. Ce n'est pas sequence qui cause l'avertissement, mais 14, et vous pouvez résoudre le problème en faisant 14 non signé en ajoutant un u à la fin.

(sequence >> 14u)
36
Ryan Haining

Je pense que la promotion de nombre entier provoque ici l'avertissement. Les opérandes plus petits qu'un int sont élargis en entier pour l'expression arithmétique, qui est signée. Donc, votre code est effectivement return ( (int)sequence >> 14)==3;, ce qui conduit à l'avertissement. Essayez return ( (unsigned)sequence >> 14)==3; ou return (sequence & 0xC000)==0xC000;.

8
user5329483