webentwicklung-frage-antwort-db.com.de

Bedeutung von% x und ~

int m=32
printf("%x" , ~m);

Die Ausgabe dieser Anweisung ist ffdf und ohne ~ ist die Ausgabe 20. Welche Bedeutung haben %x und ~?

9
Brite Roy

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
20

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

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

2
Omar

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

1
Keith Thompson

~ 32 = -33 Verwenden Sie unsigned int, um Ergebnisse zu erhalten

1
Fedor Igumnov

Und% x bedeutet, dass Sie den Wert von x im Hexadezimalwert drucken.

1
delannoyk