Pourquoi ce droit au niveau du bit changement semble pas fonctionner?
-
06-09-2019 - |
Question
Quelqu'un pourrait-il me expliquer pourquoi le masque n'est pas déplacé vers la droite du tout? Vous pouvez utiliser quoi que ce soit en place de ce 1 et le résultat sera le même.
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
La solution
Il est une question de type. Si vous lancez le 0 à unsigned il sera bien:
unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);
Modifier par les commentaires: ou utiliser la notation littérale non signée, ce qui est beaucoup plus succinct. :)
unsigned mask = ~0u >> 1;
printf("%u\n", mask);
Autres conseils
Qu'est-ce qui se passe est ~0
est un entier avec tous les bits (-1
). Maintenant, vous passez à droite par 1
; car il est -1
, extension de signe conserve le bit réglé de telle sorte qu'il est resté signé (ce n'est pas ce que vous attendiez). Elle est alors convertie en unsigned comme prévu.
Essayez ceci:
unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);
L'ERS de l'affectation est traitée comme une quantité signée à moins que vous lancez, ce qui signifie que vous voyez extension de signe sans le casting. (J'ai aussi changé votre déclaration d'impression pour afficher le numéro dans l'hexagone, ce qui est plus facile pour moi de décoder.)
~ 0 est une chaîne de ceux. Le >> opérateur les déplace, et une valeur signée, elle se déplace dans les bits d'ordre supérieur. Ainsi, vous pouvez changer tout ce que vous voulez, le résultat ne changera pas.