2013-03-11 22 views
6

Von The Open Group Basisspezifikationen Ausgabe 7, IEEE Std 1.003,1-2008:Warum gibt signbit (-0) 0 zurück?

Das Vorzeichenbit() Makro einen Wert ungleich Null zurückkommen werden, wenn und nur wenn das Zeichen ihres Arguments Wert negativ .

Warum signbit(-0) Rückkehr 0? Ich möchte nur die Logik hinter dieser Entscheidung verstehen.

+4

Muss Ergänzung Zweierkomplement verwendet – Mike

+1

0 wird intern als 0.000.000 dargestellt (na ja, in 8-Bit), dessen Vorzeichenbit 0 (also es gibt 0), -1 beispielsweise wird intern als 11111111 dargestellt (in 8 Bit), dessen Vorzeichen Bit ist 1. Das ist, was Sie sehen –

Antwort

9

In signbit(-0):

  • 0 ist eine Konstante vom Typ int.
  • -0 ist das Ergebnis der Negation 0, so ist es Null des Typs int.
  • Dieser Wert wird in Gleitkommazahl konvertiert.
  • Das Vorzeichenbit in dem Fließkommawert gleich Null ist, so signbit(-0) erzeugt 0.

Wenn Sie signbit(-0.) stattdessen tun:

  • 0. ist eine Konstante vom Typ double.
  • -0. ist das Ergebnis der Negation 0., so ist es eine negative Null des Typs double.
  • Das Vorzeichenbit in dem Gleitkommawert eins ist, so ergibt signbit(-0.) 1.

Der Schlüssel ist, dass eine ganze Zahl -0 Typ negiert, und die ganze Zahl Typen aus einem typischerweise keine negativen Null im Unterschied kodieren positive Null. Wenn eine Ganzzahl Null in Gleitkomma umgewandelt wird, ist das Ergebnis eine einfache (positive) Null.-0. negiert jedoch einen Fließkommatyp, und die Fließkommatypen codieren negative Null eindeutig von positivem Nullpunkt.

+0

Beachtet C ein Literal "-0.0" und behält es negativ? Ich musste mich vorher nie darum kümmern, also habe ich nie überprüft ... – cHao

+1

cHao: Der Basis-C-Standard ist nicht streng darüber, wie Fließkomma gehandhabt wird. Typische Implementierungen, insbesondere diejenigen, die IEEE 754 verwenden, werden das Vorzeichenbit in Fließkomma-Nullen beibehalten, insbesondere bei einfachen Operationen. (Zum Beispiel wäre ich nicht überrascht, wenn die Bibliotheksroutinen in einigen Implementierungen weniger streng in der Zeichenbehandlung wären.) –

11

Im Zweierkomplement, das bei weitem die häufigste Darstellung für Ganzzahlen mit Vorzeichen ist, gibt es keine negative Null. -0 == +0 in allen Fällen, sogar bitweise. Wenn also der Code des Makros ihn verarbeitet, ist das Zeichen bereits ((float) -0) bereits weg.

Wenn Sie testen möchten, haben Sie möglicherweise mehr Glück mit etwas wie signbit(-0.0) oder signbit(-1.0 * 0). Da Sie an dieser Stelle nicht von einer Ganzzahl konvertieren, sollte die Zahl immer noch ein Zeichen haben.

+1

Das Zeichen-Bit-Makro arbeitet nur mit Fließkommadaten, die normalerweise nicht in Zweierkomplement dargestellt werden. –

+0

@ StephenCanon: Nun. Das ist peinlich. :) Hoffentlich deckt die feste Erklärung das ab. – cHao

2

Es tut es nicht. Der signbit-Makro gibt das Literalzeichenbit eines Gleitkommadatenwerts zurück. Beachten Sie den Text: "Wenn das Vorzeichen des Arguments" negativ ist, nicht "Wenn das Argument" negativ ist.

Fußnote 236 in der C-Norm stellt klar:

Das Vorzeichenbit Makro meldet die Zeichen aller Werte, einschließlich Unendlichkeiten, Nullen und NaNs.

Ist dies eine hypothetische Frage, oder haben Sie eine fehlerhafte Implementierung?

+0

Ich lerne gerade C und experimentiere mit verschiedenen Funktionen. – syntagma

+2

Das Vorzeichen-Bit von "-0" ist "0". Es wird nicht zu einem Fließkommatyp befördert, bis das Vorzeichenbit verloren ist. –

+0

@ JonathanGrynspan: Richtig, ich habe 'signbit (-0)' nicht als wörtlichen Programmtext interpretiert, aber vielleicht hätte ich es tun sollen. –

Verwandte Themen