2010-10-17 11 views
20

Wie stellt C negative ganze Zahlen dar?Darstellung negativer Zahlen in C?

Ist es durch Zweierkomplementdarstellung oder durch Verwendung des MSB (höchstwertiges Bit)?

-1 in hexadezimal ist ffffffff.

Also bitte klären Sie dies für mich.

+1

Natürlich maschinenabhängig, obwohl die Referenzlisten - ich glaube - drei Varianten. Die Byte-Reihenfolge ist für das Speicherlayout von Zahlen relevant: für 4 Byte ABCD, DCBA, BADC: '(uint8_t *) intptr'. –

Antwort

38

ISO C (C99), Abschnitt 6.2.6.2/2, besagt, dass eine Implementierung eine von drei verschiedenen Darstellungen für integrale Datentypen, Zweierkomplement, Einerkomplement oder Vorzeichen/Größe wählen muss (obwohl es unwahrscheinlich ist, dass die Zweierkomplement-Implementierungen weit entfernt sind) überwiegen die anderen).

In all diesen Darstellungen sind positive Zahlen identisch, der einzige Unterschied sind die negativen Zahlen.

Um die negative Darstellung für eine positive Zahl zu erhalten, Sie:

  • Invertzucker alle Bits dann ein Komplement für zwei hinzufügen.
  • Invertieren Sie alle Bits für das Einerkomplement.
  • Invertieren Sie nur das Vorzeichenbit für Vorzeichen/Betrag.

Sie können dies in der unten stehenden Tabelle finden Sie unter:

 
number | two's complement | ones' complement | sign/magnitude 
=======|=====================|=====================|==================== 
    5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 
    -5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 

Beachten Sie, dass die ISO-Mandat nicht, dass alle Bits sind in der Darstellung verwendet. Sie führen das Konzept eines Vorzeichenbits, der Wertbits und der Füllbits ein. Jetzt habe ich nie tatsächlich eine Implementierung mit Füllbits gesehen, aber aus dem C99 Begründung Dokument, sie haben diese Erklärung:

eine Maschine Angenommen, verwendet ein Paar von 16-Bit-Shorts (jedes mit seinem eigenen Zeichen-Bit), um einen 32-Bit-Int zu bilden, und das Vorzeichen-Bit des unteren Kurzschlusses wird ignoriert, wenn es in diesem 32-Bit-Int verwendet wird. Dann gibt es als ein 32-Bit vorzeichenbehaftetes int ein Auffüllbit (in der Mitte der 32 Bits), das beim Bestimmen des Werts des 32-Bit-Vorzeichens int ignoriert wird. Wenn dieses 32-Bit-Objekt jedoch als 32-Bit-Zeichen ohne Vorzeichen behandelt wird, ist dieses Füllbit für das Programm des Benutzers sichtbar. Dem C-Komitee wurde gesagt, dass es eine Maschine gibt, die auf diese Weise funktioniert, und das ist ein Grund, dass Füllbits zu C99 hinzugefügt wurden.

Ich glaube, dass Maschine sie war bezogen haben kann das Datacraft 6024 (und es Nachfolger von Harris Corp).In diesen Maschinen hatten Sie ein 24-Bit-Wort für die vorzeichenbehaftete Ganzzahl, aber wenn Sie den breiteren Typ wollten, wurden zwei davon zusammen als 47-Bit-Wert mit dem Vorzeichen eines der Wörter ignoriert:

+0

+1, schönes Beispiel! – Edmund

+0

Wundert mich, warum die (scheinbar) komplexeste Variante, zwei komplementär, am beliebtesten ist. Das Umdrehen eines einzelnen Bits (Vorzeichen/Betrag) oder das Umdrehen aller Bits (Einerkomplement) erscheint einfacher. Ich denke, die Popularität von Zweierkomplementen hängt nicht davon ab, wie es funktioniert, sondern wie beliebt die Implementierung der Maschine ist (aus anderen technischen oder Marketinggründen). –

+1

@FrerichRaabe Direkt aus Wikipedia "Binäre Arithmetik funktioniert nicht." Im Wesentlichen, wie würde der Addierer sein negatives gegen positives wissen. http://simple.wikipedia.org/wiki/Signed_number_representations –

11

C ermöglicht Zeichen/Betrag, Einerkomplement und Zweierkomplementdarstellungen von Ganzzahlen mit Vorzeichen. Die meisten typischen Hardware verwendet Zweierkomplement für Ganzzahlen und Vorzeichen/Größe für Fließkommazahl (und noch eine andere Möglichkeit - eine "Bias" -Darstellung für den Gleitkommaexponenten).

1

Für integrale Typen ist es normalerweise Zweierkomplement (implementierungsspezifisch). Für Gleitkommazahlen gibt es ein Vorzeichenbit.

6

-1 in Hexadezimal ist Ffffffff. Also bitte klären Sie mich diesbezüglich auf.

In Zweier-Komplement (der bei weitem am häufigsten verwendeten Darstellung), wobei jedes Bit außer dem höchstwertigen Bit (MSB), von rechts nach links (Größenordnung erhöht wird) hat einen Wert 2 n wo n steigt von Null um Eins. Das MSB hat den Wert -2 n.

So zum Beispiel in einer 8-Bit-Zweier-Komplement-Ganzzahl, hat das MSB den Platz Wert -2 (-128), so dass die binäre Zahl: 1111 1111 gleich -128 + 0111 1111 = -128 + 127 = -1

Ein nützliches Merkmal des Zweierkomplements ist, dass die ALU eines Prozessors nur einen Addierblock benötigt, um eine Subtraktion durchzuführen, indem das Zweierkomplement des rechten Operanden gebildet wird. Zum Beispiel 10 - 6 entspricht 10 + (-6); in 8-Bit-binär (zur Vereinfachung der Erläuterung) das wie folgt aussieht:

0000 1010 
    +1111 1010 
    --------- 
[1]0000 0100 = 4 (decimal) 

Wo der [1] ist der verworfene Übertragsbit. Ein anderes Beispiel; 10 - 11 == 10 + (-11):

0000 1010 
    +1111 0101 
    --------- 
    1111 1111 = -1 (decimal) 

Ein weiteres Merkmal der beiden ergänzen ist, dass sie einen einzigen Wert Null darstellt, während vorzeichen Betrag und Einerkomplement jeweils zwei; +0 und -0.

Verwandte Themen