int m=32
printf("%x" , ~m);
La sortie de cette instruction est ffdf
et sans ~
la sortie est 20
. Quelle est la signification de %x
et ~
?
L'opérateur ~
est une négation au niveau du bit. Il imprimera la négation au niveau du bit de la valeur de m
. %x
signifie que printf
affichera sa valeur au format hexadécimal.
Donc, la valeur 0xffdf
est la négation de la valeur 0x20
(32).
Valeur 32 (int bits serait):
0000 0000 0010 0000
Sa négation au niveau du bit sera:
1111 1111 1101 1111
Ce qui a du sens puisque:
1111 1111 = 0xff
Et:
1101 1111 = 0xdf
Le %x
est le format printf
qui indique que la valeur int
doit être affichée en hexadécimal.
Le ~
est bitwise NOT , qui retourne tous les bits du nombre entier.
La déclaration:
printf("%x", m);
affichera la sortie 20
sous la forme 0x20
= décimal 32
.
La déclaration:
printf("%x", ~m);
affichera la sortie ffdf
car 0xffdf
est l'inverse au sens binaire de 0x20
.
Il peut être plus logique de visualiser la négation au niveau du bit en binaire:
Base 10: 32 65503
Base 16: 0x20 0xFFDF
Base 2: 0000000000100000 1111111111011111
Le symbole ~
représente l'opérateur au niveau du bit NOT , ou opérateur complémentaire ; une opération unaire qui effectue une négation logique sur chaque bit}, formant le complément de la valeur binaire donnée. Les chiffres binaires qui sont 0 deviennent 1, et ceux qui sont 1 deviennent 0.
32 correspond à 00100000 en binaire et ~ 32 à 11011111 en binaire (ou 223 en décimal).
L'option %x
de la fonction printf
affiche un format hexadécimal non signé (en lettres minuscules).
Alors,
printf("%x", m); // displays the hexadecimal value of 32 (00100000), "20"
printf("%x", ~m); // displays the hexadecimal value of ~32 (11101111), "ffdf"
[Sources]
http://en.wikipedia.org/wiki/Bitwise_operation#NOT
http://en.wikipedia.org/wiki/Hexadecimal
http://fr.wikipedia.org/wiki/Printf_format_string
Cela signifie que x
aurait probablement dû être déclaré unsigned
plutôt que int
.
Le format printcode "%x"
nécessite un argument unsigned int
et affiche sa valeur au format hexadécimal (base 16). Vous pouvez l'utiliser en toute sécurité avec un argument int
si la valeur est comprise dans la plage que vous pouvez représenter sous la forme int
ou unsigned int
(c'est-à-dire 0 .. INT_MAX
). Utiliser "%x"
avec une valeur int
négative, comme le fait ce fragment de code, a à proprement parler un comportement indéfini, même si le comportement réel est susceptible d'être raisonnablement cohérent.
La norme C dit:
Le résultat de l'opérateur ~ est le complément binaire de son opérande (Promu) (c'est-à-dire que chaque bit du résultat est défini si et seulement Si le bit correspondant de la l’opérande converti n’est pas défini).
Notez qu'il est défini en termes de representation de l'opérande, pas sa valeur.
La sortie que vous décrivez indique que vous utilisez un système avec des entiers signés à complément double où int
ne représente que 16 bits, ce qui est inhabituel de nos jours. (Utilisez-vous un ancien compilateur Turbo C ou quelque chose de similaire?) Sur mon système, ce programme:
#include <stdio.h>
int main(void) {
int m = 32;
printf("%x\n" , ~m);
return 0;
}
produit cette sortie:
ffffffdf
(Notez que j'ai ajouté le #include <stdio.h>
requis et un point-virgule sur la déclaration de m
.)
~ 32 = -33 utilise unsigned int pour obtenir des résultats
Et% x signifie que vous imprimez la valeur de x en hexadécimal.