2016-12-21 2 views
1

Ich bin nach diesem Tutorial: https://www.tutorialspoint.com/cprogramming/c_bitwise_operators.htm https://www.tutorialspoint.com/cprogramming/c_operators.htmBit Flipping - Wie lautet die Antwort -61?

Ich bin verwirrt, wie A, die beginnt als: A = 0011 1100 (60 dezimal) werden kann, -61, wenn alle Bits mit dem Operator ~ gekippt werden.

Ich verstehe, dass ~A wird: 1100 0011. Aus meinen Berechnungen ist diese Binärzahl 1100 0011 195 in Dezimal. Die Antwort lautet jedoch -61 in der Basis zehn, entsprechend der Programmiersprache c und dem Tutorial.

Könnte mir bitte jemand helfen, zu verstehen?

Vielen Dank für das Lesen dieser Frage.

+1

195-256 = -61: Zweier-Komplement auf einem 8-Bit-Typ –

+0

Bitte zeigen Sie den genauen Code, den Sie laufen, damit wir versuchen können, das Problem zu reproduzieren, anstatt Raten. – merlin2011

+0

Dies sollte nicht überraschend sein, da (per Definition) "-x = ~ x + 1" und daher "~ x = -x - 1" – harold

Antwort

1

Wenn Sie die Bits eines positiven Werts mit Vorzeichen spiegeln, kippen Sie auch das höhere Bit (bei einem beliebigen Typ).

Wenn Sie also den Wert drucken, erhalten Sie einen negativen Wert.

Mit einem unsigned 8-Bit-Typ, werden Sie bekommen, was Sie wollen:

#include <stdio.h> 

int main() 
{ 
    int x = 60; 
    printf("%d\n",~x); 
    char y = x; 
    printf("%d\n",~y); 
    unsigned char z = x; 
    printf("%u\n",(unsigned char)~z); 

    return 0; 
} 

Ergebnis:

-61 
-61 
195 

für integer & char, Sie -61 bekommen, aber wenn Sie eine verwenden unsigned char, erhalten Sie 195, höheres Bit wird für Wert nicht für Zeichen verwendet.

1100 0011 ist 195, wenn alle Bits mit derselben Bedeutung (unsigned) berücksichtigt werden.

1100 0011 unterzeichnet ist 100 0011=64+2+1=67 - 2^7=128 = -61

+0

Ehrfürchtig. Aber kannst du mir erklären, wie ich das mit der Hand bekommen würde? Wie wird 1100 0011 -61, wenn es 195 zu bedeuten scheint? Das ist interessant, wie der nicht signierte Char 195 wird, wenn er umgedreht wird, genau so, wie ich es bekomme, wenn ich die Bits mit der Hand umblättere und dann den darauf basierenden Basiswert herausfinde. :) – user3870315

+0

@ user3870315 Sie haben auch -61 von Hand, interpretieren Sie diese Bits als eine 8bit vorzeichenbehaftete Ganzzahl. – harold

+0

Ich bin mir nicht sicher, wie man das @harold macht. 0_o – user3870315

Verwandte Themen