int m=32
printf("%x" , ~m);
Die Ausgabe dieser Anweisung ist ffdf
und ohne ~
ist die Ausgabe 20
. Welche Bedeutung haben %x
und ~
?
Der ~
-Operator ist eine bitweise Negation. Es wird eine bitweise Negation des Werts von m
ausgegeben. %x
bedeutet, dass printf
den Wert im Hexadezimalformat ausgeben soll.
Der Wert 0xffdf
ist also die Negation des Wertes 0x20
(32).
Wert 32 (int Bits wären):
0000 0000 0010 0000
Seine bitweise Negation wird sein:
1111 1111 1101 1111
Was macht da Sinn:
1111 1111 = 0xff
Und:
1101 1111 = 0xdf
Der %x
ist das printf
-Format , das angibt, dass der int
-Wert hexadezimal angezeigt werden soll.
Der ~
ist bitweise NOT , wodurch alle Bits in der Ganzzahl umgedreht werden.
Die Aussage:
printf("%x", m);
zeigt die Ausgabe 20
als 0x20
= dezimal 32
an.
Die Aussage:
printf("%x", ~m);
zeigt die Ausgabe ffdf
an, da 0xffdf
die bitweise Umkehrung von 0x20
ist.
Es kann sinnvoller sein, die bitweise Negation binär zu visualisieren:
Base 10: 32 65503
Base 16: 0x20 0xFFDF
Base 2: 0000000000100000 1111111111011111
Das ~
-Symbol steht für den bitweisen NOT oder Komplementoperator ; eine unäre Operation, die für jedes Bit eine logische Negation durchführt, die das Einsen-Komplement des angegebenen Binärwerts bildet. Binärziffern, die 0 sind, werden 1, und diejenigen, die 1 sind, werden 0.
32 ist binär 00100000 und ~ 32 ist binär 11011111 (oder 223 dezimal).
Die %x
-Option in der printf
-Funktion zeigt ein vorzeichenloses Hexadezimalformat (mit Kleinbuchstaben) an.
So,
printf("%x", m); // displays the hexadecimal value of 32 (00100000), "20"
printf("%x", ~m); // displays the hexadecimal value of ~32 (11101111), "ffdf"
[Quellen]
http://en.wikipedia.org/wiki/Bitwise_operation#NOT
http://en.wikipedia.org/wiki/Hexadecimal
http://en.wikipedia.org/wiki/Printf_format_string
Dies bedeutet, dass x
wahrscheinlich unsigned
und nicht int
deklariert worden sein sollte.
Das "%x"
-printf-Format erfordert ein unsigned int
-Argument und gibt den Wert hexadezimal aus (Basis 16). Sie können es mit einem int
-Argument verwenden, wenn der Wert innerhalb des Bereichs liegt, der entweder als int
oder als unsigned int
(d. H. 0 .. INT_MAX
) darstellbar ist. Die Verwendung von "%x"
mit einem negativen int
-Wert hat genau wie dieses Codefragment ein undefiniertes Verhalten, obwohl das tatsächliche Verhalten wahrscheinlich ziemlich konsistent ist.
Der C-Standard sagt:
Das Ergebnis des Operators ~ ist das bitweise Komplement seines Operanden (Heraufgestuft) (d. H. Jedes Bit im Ergebnis wird gesetzt, wenn und nur , Wenn das entsprechende Bit im konvertierter Operand ist nicht gesetzt).
Beachten Sie, dass es als Darstellung des Operanden definiert ist und nicht als Wert.
Die Ausgabe, die Sie beschreiben, zeigt an, dass Sie ein System mit Zweierkomplement-Ganzzahlen verwenden, bei denen int
nur 16 Bit ist, was heutzutage ungewöhnlich ist. (Verwenden Sie einen alten Turbo C-Compiler oder ähnliches?) Auf meinem System ist dieses Programm:
#include <stdio.h>
int main(void) {
int m = 32;
printf("%x\n" , ~m);
return 0;
}
produziert diese Ausgabe:
ffffffdf
(Beachten Sie, dass ich den erforderlichen #include <stdio.h>
und ein Semikolon in der Deklaration von m
hinzugefügt habe.)
~ 32 = -33 Verwenden Sie unsigned int, um Ergebnisse zu erhalten
Und% x bedeutet, dass Sie den Wert von x im Hexadezimalwert drucken.