web-dev-qa-db-fra.com

Signification de% x et ~

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 ~?

9
Brite Roy

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
20
Pablo Santa Cruz

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
6
Edward Thomson

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

2
Omar

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.)

1
Keith Thompson

~ 32 = -33 utilise unsigned int pour obtenir des résultats

1
Fedor Igumnov

Et% x signifie que vous imprimez la valeur de x en hexadécimal.

1
delannoyk