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);
Était-ce utile?

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

Inscrivez-vous l'extension

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top