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.
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. Auf eine 2-Komplement-Maschine gibt es keinen Unterschied bei der bit-Ebene.
@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.
@VirtualSnake Das ist richtig, wir reden über
int
. Siehe Ones " Komplement-Codierung. InformationsquelleAutor der Frage Filip Minx | 2015-04-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
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
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.
Für eine
int
(in der fast-universal "2-Komplement" Darstellung) die Darstellungen von0
und-0
sind die gleichen. (Sie können unterschiedlich sein für andere Zahl-Darstellungen, zB. IEEE 754 floating point.)InformationsquelleAutor der Antwort RichieHindle
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:
Lassen Sie uns nun die Reihenfolge aller bits und addieren von 1 zu Holen Sie sich die 2 ergänzen:
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
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:
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
Wenn Ihr Rechner verschiedene Repräsentationen für
-0
und+0
, dannmemcmp
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
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
-
angewendet0
nur als drei plus fünf ist nur die binärer operator+
angewendet3
und5
.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: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
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