Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

Unäre Operationen





Frage

Hallo Leute, ich habe da mal ne Frage: Wie genau funktioniert die Unäre Operation? Also als bsp. ein C Quellcode: [code] void main() { int e, x=9; e=~x; printf("Ausgabe von %d im Unären ergibt: %d",x,e); } [/code] Das ergibt: [code]Ausgabe von 9 im Ünären ergibt: -10[/code] Wie kann ich mir das erklären? Ich habe es versucht mit Bitweiser Erklärung da kann ich mir die Neun als Bitmuster so erklären: [code]9 = 0000 1001[/code] Die Minus Zehn sieht so aus: [code]-10 = 1111 1001[/code]. Ich kann mir aber nicht vorstellen das es einfach nur eine "Umdrehung der Bits" ist. Zumal ich gehört habe man müsse da irgendwie noch Plus eins rechnen. Ich bedanke mich schonmal für eure Hilfe. ©as

Antwort 1 von semi

e=~x; heisst einfach e ist NOT x (Einerkomplement bzw. Negation).
Klartext: Alle Bits von x, nur halt andersrum :-)

Das was Du mit dem +1 meinst, kommt im Zusammenhang mit dem sogenannten Zweierkomplement.
Wird bei Binärsubtraktion benötigt, da Binärzahlen nicht so ohne weiteres subtrahiert werden können, wenn nur das hächste Bit über das Vorzeichen entscheidet. Oder anders ausgedrückt, Subtraktion gibt es im PC nicht. Nur Addition negativer Zahlen
z.B.

12 - 8 = 12 + (-8)

Was passiert.

-8 könnte man binär wie folgt schreiben (höchstes Bit ist Vorzeichen; hier 1 Byte)

1000 1000
--------------------------------------

    0000 1010 (12)
+   1000 1000 (-8)
-------------------
    1001 0010 (-40) !!! geht nicht

Lösung:
1) Das höchste Bit von -8 löschen
2) Einerkomplement bilden
3) 1 dazuaddieren

    1000 1000 (-8)
    0000 1000 (höchstes Bit gelöscht)
    1111 0111 (Negation; Einerkomplement)
    1111 1000 (1 dazuaddiert)
Diese Zahl kannst Du zu 12 dazuaddieren

    0000 1010 (12)
+   1111 1000 (-8)
-------------------
 (1)0000 0010 (=4) 


Gruß,
Michael

Antwort 2 von semi

Ups! Kleiner Fehler. Alles ein Bit weiter, die 12 stimmt nicht :-)

--------------------------------------

    0000 1100 (12)
+   1000 1000 (-8)
-------------------
    1001 0100 (-36) !!! geht nicht

Lösung:
1) Das höchste Bit von -8 löschen
2) Einerkomplement bilden
3) 1 dazuaddieren

    1000 1000 (-8)
    0000 1000 (höchstes Bit gelöscht)
    1111 0111 (Negation; Einerkomplement)
    1111 1000 (1 dazuaddiert)
Diese Zahl kannst Du zu 12 dazuaddieren

    0000 1100 (12)
+   1111 1000 (-8)
-------------------
 (1)0000 0100 (=4) 

Jetzt aber. :)

Gruß,
Michael

Antwort 3 von Casvil

Ja danke ich habe es nun verstanden. aber wie mache ich denn nun dem pc klar, dass ich dass zweierkomplement meine?

danke
schonmal
©as



Antwort 4 von Casvil

Ja danke ich habe es nun verstanden. aber wie mache ich denn nun dem pc klar, dass ich dass zweierkomplement meine?

danke
schonmal
©as



Antwort 5 von semi

Dies ist bei negativen Zahlen bereits der Fall.

Schau Dir die Ausgane von dem hier an


typedef unsigned char byte;

int main()
{
  byte a = 8;

  a = ~a + 1; // Zweierkomplement bilden; Negieren und 1 dazuaddieren
  printf("%x\n", a);

  a = -8; // -8 wird bereits als Zweierkomplement dargestellt
  printf("%x\n", a);

  return 0;
}

Gruß,
Michael