Der Operator ~
ist eine bitweise Negation. Es wird die bitweise Negation des m
-Werts gedruckt. %x
bedeutet, dass printf
seinen Wert im Hexadezimalformat ausgibt.
Also ist der Wert 0xffdf
die Negation des Wertes 0x20
(32).
Wert 32 (int Bits wären):
%Vor%Seine bitweise Negation wird sein:
%Vor%Was macht Sinn seit:
%Vor%Und:
%Vor% Das %x
ist das printf
-Format , das angibt, dass der int
-Wert angezeigt werden soll in hexadezimal.
Das ~
ist bitweise NICHT , wodurch alle Bits in der ganzen Zahl umgedreht werden.
Die Aussage:
%Vor% zeigt die Ausgabe 20
als 0x20
= dezimal 32
.
Die Aussage:
%Vor% zeigt die Ausgabe ffdf
als 0xffdf
ist die bitweise Umkehrung von 0x20
.
Es mag sinnvoller sein, die bitweise Negation im Binärformat zu visualisieren:
%Vor%Das Symbol% co_de% steht für den bitweisen NICHT oder Komplementoperator ; eine unäre Operation, die für jedes Bit eine logische Negation durchführt , die das Einerkomplement des gegebenen binären Wertes bildet. Binärziffern, die 0 sind, werden 1 und diejenigen, die 1 sind, werden 0.
32 ist 00100000 binär und ~ 32 ist 11011111 binär (oder 223 dezimal).
Die Option ~
in der Funktion %x
zeigt ein unsigniertes hexadezimales Format (in Kleinbuchstaben) an.
Also,
%Vor% Dies bedeutet, dass x
wahrscheinlich eher als unsigned
und nicht als int
deklariert wurde.
Das "%x"
printf-Format erfordert ein unsigned int
-Argument und gibt seinen Wert in hexadezimal (Basis 16) aus. Sie können es sicher 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
) dargestellt werden kann. Die Verwendung von "%x"
mit einem negativen int
-Wert, wie dieses Codefragment genau hat, hat undefiniertes Verhalten, obwohl das tatsächliche Verhalten wahrscheinlich ziemlich konsistent ist.
Der C-Standard sagt:
Das Ergebnis des Operators ~ ist das bitweise Komplement seiner (promoed) Operand (dh jedes Bit im Ergebnis wird genau dann gesetzt wenn das entsprechende Bit im konvertierten Operanden nicht gesetzt ist).
Beachten Sie, dass es in der -Darstellung des Operanden definiert ist, nicht in seinem Wert.
Die Ausgabe, die Sie beschreiben, zeigt an, dass Sie ein System mit vorzeichenbehafteten Zweierkomplement-Ganzzahlen verwenden, wobei int
nur aus 16 Bits besteht, was heutzutage ungewöhnlich ist. (Verwenden Sie einen alten Turbo C Compiler oder etwas ähnliches?) Auf meinem System, dieses Programm:
erzeugt diese Ausgabe:
%Vor% (Beachten Sie, dass ich die erforderliche #include <stdio.h>
und ein Semikolon für die Deklaration von m
hinzugefügt habe.)