Samstag, Februar 22, 2020

Kann man zwischen 0 und -0 unterscheiden?

Ich weiß, dass die integer-Werte 0 und -0 sind im wesentlichen die gleichen.
Aber, Frage ich mich, ob es möglich ist, zwischen Ihnen zu unterscheiden.

Zum Beispiel, wie weiß ich, ob eine variable zugewiesen wurde -0?

bool IsNegative(int num)
{
    //How ?
}

int num = -0;
int additinon = 5;

num += (IsNegative(num)) ? -addition : addition;

Ist der Wert -0 im Speicher hinterlegt ist, die in exakt der gleichen Weise wie 0?

Kommentare dem Thema
Für ganze zahlen gibt es keinen Unterschied. Kommentarautor: Maroun
Dies hängt von der Umsetzung, aber für Implementierungen, in denen int dargestellt in 2-Komplement (die bei weitem am häufigsten anzutreffen), 0 und -0 haben identische bitweisen Darstellungen. Kommentarautor: Mankarse
Auf eine 2-Komplement-Maschine gibt es keinen Unterschied bei der bit-Ebene. Kommentarautor: Marco A.
@VirtualSnake: Was bedeutet „Binär“? Es gibt tatsächlich, binäre Codierungen, für die es wird eine Unterscheidung zwischen -0 und 0. Vorzeichen und Größenordnung, zum Beispiel. Kommentarautor: Benjamin Lindley
@VirtualSnake Das ist richtig, wir reden über int. Siehe Ones “ Komplement-Codierung. Kommentarautor: CiaPan

InformationsquelleAutor der Frage Filip Minx | 2015-04-30

7 Kommentare

  1. 110

    Hängt es von der Maschine, die Sie sind targeting.

    Auf einer Maschine verwendet, die eine 2-Komplement-Darstellung für Ganzzahlen gibt es keinen Unterschied bei der bit-Ebene zwischen 0 und -0 (Sie haben die gleiche Darstellung)

    Wenn Ihre Maschine verwendet Einerkomplement Sie definitiv könnte

    0000 0000   -> signed01111 1111   -> signed   0

    Offensichtlich reden wir über die Verwendung native Unterstützung, x86-Prozessoren der Serie haben native Unterstützung für das zwei-Komplement-Repräsentation von vorzeichenbehafteten zahlen. Mit anderen Darstellungen ist auf jeden Fall möglich, würde aber wahrscheinlich werden weniger effizient und benötigen mehr Anweisungen.

    (Wie JerryCoffin auch festgestellt: selbst wenn man die Ergänzung berücksichtigt wurde meist aus historischen Gründen, unterzeichnet Größenordnung Darstellungen sind noch relativ Häufig und haben eine separate Darstellung für positive und negative null)

    InformationsquelleAutor der Antwort Marco A.

  2. 14

    Für eine int (in der fast-universal „2-Komplement“ Darstellung) die Darstellungen von 0 und -0 sind die gleichen. (Sie können unterschiedlich sein für andere Zahl-Darstellungen, zB. IEEE 754 floating point.)

    InformationsquelleAutor der Antwort RichieHindle

  3. 12

    Beginnen wir mit der Vertretung von 0 in 2er-Komplement (natürlich gibt es viele andere Systeme und Darstellungen, die ich hier spreche diese spezifische ein), wenn 8-bit null ist:

    0000 0000

    Lassen Sie uns nun die Reihenfolge aller bits und addieren von 1 zu Holen Sie sich die 2 ergänzen:

    1111 1111 (flip)
    0000 0001 (add one)
    ---------
    0000 0000

    wir haben 0000 0000, und das ist die Darstellung von -0 als gut.

    Aber beachten Sie, dass im 1-Komplement, signiert 0 0000 0000,, aber -0 1111 1111.

    InformationsquelleAutor der Antwort Maroun

  4. 9

    Habe ich beschlossen, zu verlassen, diese Antwort, da C und C++ – Implementierungen sind in der Regel eng verwandten, aber in der Tat ist es nicht aufschieben zum C-standard, wie ich dachte, es Tat. Der Punkt bleibt, dass die C++ – standard nicht spezifiziert, was passiert, für Fälle wie diese. Es ist auch relevant, dass nicht-zweier-Komplement-Darstellungen sind überaus selten in der realen Welt, und dass selbst wo Sie existieren Sie oft verstecken der Unterschied in vielen Fällen eher als setzen Sie es als etwas, was jemanden erwarten könnte leicht zu entdecken.


    Das Verhalten der negativen Nullen in der integer-Darstellungen, in denen Sie existieren, ist nicht so streng definiert im C++ – standard, wie er in der C-standard. Tut es, allerdings zitieren die C-standard (ISO/IEC 9899:1999) als normative Referenz in der obersten Ebene [1.2].

    In der C-standard [6.2.6.2], eine negative null-kann nur das Ergebnis der bitweisen Operationen, oder Operationen, bei denen eine negative null bereits vorhanden ist (zum Beispiel, Multiplikation oder Division negativ null durch einen Wert, oder das hinzufügen einer negativen null, null), – Anwendung des unären minus-operator zu einem Wert von normal null, wie in deinem Beispiel ist also garantiert in einem normal null.

    Selbst in den Fällen, die kann erzeugen eine negative null, es gibt keine Garantie, dass Sie auch auf einem system, unterstützt die negative null:

    Es ist nicht spezifiziert, ob diese Fälle tatsächlich erzeugen eine negative null oder eine normale null ist, und ob ein negativ-null wird zum normal-null, wenn in einem Objekt gespeichert.

    Deshalb können wir schließen: Nein, es gibt keinen zuverlässigen Weg zu erkennen, in diesem Fall. Auch wenn nicht für die Tatsache, dass nicht-zweier-Komplement-Darstellungen sind sehr ungewöhnlich in der modernen computer-Systeme.

    Den C++ – standard, für seinen Teil, macht keine Erwähnung des Begriffs „negative null“, und hat sehr wenig Diskussion der details signed magnitude und einer-Komplement-Darstellungen, außer zu beachten [3.9.1 ABS 7], dass Sie zulässig sind.

    InformationsquelleAutor der Antwort Random832

  5. 7

    Wenn Ihr Rechner verschiedene Repräsentationen für -0 und +0, dann memcmp wird in der Lage sein, Sie zu unterscheiden.

    Wenn padding-bits vorhanden sind, wird es vielleicht tatsächlich mehrere zusagen für andere Werte als null als gut.

    InformationsquelleAutor der Antwort Ben Voigt

  6. 5

    In der Sprache C++ Spezifikation, es gibt keine solche int als negativ null.

    Die einzige Bedeutung, die diese beiden Wörter haben ist der unäre operator - angewendet 0 nur als drei plus fünf ist nur die binärer operator + angewendet 3 und 5.

    Wenn gab es eine deutliche negativ null, Zweierkomplement (die häufigste Darstellung von Integer-Typen), wäre eine Unzureichende Repräsentation für C++ – Implementierungen, da es keine Möglichkeit gibt, repräsentieren zwei Formen der null.


    Im Gegensatz dazu, schwimmende Punkte (nach IEEE) separate positive und negative Nullen. Sie können unterschieden werden, zum Beispiel bei der Division 1 durch. Positive null erzeugt positive Unendlichkeit, negative null erzeugt negative Unendlichkeit.


    Jedoch, wenn es passiert, werden unterschiedliche Speicher-Darstellungen der int 0 (oder eine beliebige int, oder einen anderen Wert eines anderen Typs), die Sie verwenden können memcmp zu entdecken, dass:

    #include <string>
    
    int main() {
        int a = ...
        int b = ...
        if (memcmp(&a, &b, sizeof(int))) {
            //a and b have different representations in memory
        }
    }

    Natürlich, wenn dies geschehen ist, außerhalb des direct-memory-Operationen, die zwei Werte würden immer noch funktionieren in genau der gleichen Weise.

    InformationsquelleAutor der Antwort Paul Draper

  7. 2

    Zu vereinfachen, fand ich es einfacher zu visualisieren.

    Typ int(_32) gespeichert ist, mit 32 bits. 32 bit bedeutet 2^32 = 4294967296 eindeutige Werte. Also :

    unsigned int Daten liegen 0 bis 4,294,967,295

    Im Falle von negativen Werten es hängt davon ab, wie Sie gespeichert sind. Im Falle

    Im Falle von Einerkomplement Wert -0 existiert.

    InformationsquelleAutor der Antwort Margus

Kostenlose Online-Tests