2011-01-14 11 views
2

0x7F000000 ist 0111 1111 0000 0000 0000 0000 0000 0000 in 32-Bit-Binärdatei.
0x01000058 ist 0000 0001 0000 0000 0000 0000 0101 1000.Maskierung eines Bits in C mit unerwartetem Ergebnis

Als ich und die beiden Zahlen zusammen 0000 0001 0000 0000 0000 0000 0000 0000 erwarte ich, aber aus irgendeinem Grund, den ich bekommen 0.

Hier ist mein Code:

#define MASK_binop  0x80000000 
#define MASK_operation 0x7F000000 

int instruction=atoi(line); 
if((MASK_binop & instruction)>0) 
    printf("binop\n"); 
else if((MASK_operation & instruction)>0) 
    printf("operation\n"); 

hält Rückkehr Null Jede der oben genannten Vergleiche. Hat es etwas mit 32/64 Bits zu tun? Ich verwende einen 64-Bit-Compiler.

+4

Was ist der Wert der Linie? – taskinoor

+0

würde unsigned einen Unterschied machen? – Marlon

+0

@Marlon: höchstwahrscheinlich nicht. –

Antwort

4

Wenn die Zeile "0x01000058" enthält, gibt atoi 0 zurück, da atoi mit dezimaler Darstellung arbeitet, nicht mit hex 0x. Und dann ist das AND offensichtlich Null. Versuchen Sie, den Wert der Anweisung zu drucken.

1

Ich habe es gerade versucht und es scheint zu funktionieren wie erwartet. Machen Sie eine printf("%x\n", instruction);, um zu zeigen, was der Wert ist.

+0

Sie haben dies auf 64-Bit-Maschine versucht? Welcher Compiler? –

+0

@Andrejs, Ja. Ich habe es mit der 64-Bit-Version von VS2008 erstellt und auf einer 64-Bit-Maschine ausgeführt. –

-1

Welchen Compiler benutzen Sie?

Scheint wie Ihre atoi 32bit Ergebnis zurückgibt. Sie können versuchen atoi64.

Update:

Sorry, mein Schlechter. Es wird tatsächlich Int, 32bit auf 32-Bit-Maschine und 64bit auf 64-Bit-Maschine zurückgeben. Aber für 32bit machines ist abit64() praktisch, um mit extra großen Ganzzahlen zu arbeiten.

3

printf("%x", instruction); 

Sie und stellen Sie sicher, dass der Befehl ist wirklich das, was Sie erwarten, dass es sein.

können Sie auch tun:

printf("%x", MASK_binop & instruction); 
printf("%x", MASK_operation & instruction); 

Um zu sehen, was genau passiert ist.