2009-02-24 7 views

Répondre

25

C'est un problème de type. Si vous lancez le 0 à unsigned ce sera bien:

unsigned mask = ~ (unsigned) 0 >> 1; 
printf("%u\n", mask); 

Modifier par commentaires: ou utiliser la notation littérale non signée, ce qui est beaucoup plus succinct. :)

unsigned mask = ~0u >> 1; 
printf("%u\n", mask); 
+2

Ou juste: "masque non signé = ~ 0u >> 1;" Le suffixe u désigne un entier non signé. – Skizz

+0

Ah ouais, ça aussi. – chaos

+1

Bingo! Cette question a été difficile pour moi parce que je n'étais pas au courant de la distribution de type implicite. Les réponses précédentes ne nous ont pas éclairci un peu. –

13

Sign extension

Ce qui se passe est ~0 est un entier avec tous les bits (-1). Maintenant vous passez à droite par 1; Comme il s'agit de -1, l'extension de signe conserve le bit le plus élevé et reste donc signé (ce n'est pas ce à quoi vous vous attendiez). Ensuite, il est converti en non signé comme prévu.

2

~ 0 est une chaîne de uns. L'opérateur >> les décale, et dans une valeur signée, il les déplace dans les bits d'ordre supérieur. Donc, vous pouvez changer tout ce que vous voulez, le résultat ne changera pas.

4

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 également changé votre instruction d'impression pour afficher le nombre en hexadécimal, ce qui est plus facile pour moi de décoder.)