2013-02-19 10 views
9

Es ist eine lange Zeit her, seit ich das letzte Mal an der Bits und Bytes Ebene programmiert und wollte etwas, das ich aus diesen Tagen scheinen zu bestätigen, sich zu erinnern:um zwei oder ohne Vorzeichen ganzen Zahlen

sagen, dass ich zwei ganze Zahlen von gleicher Länge haben (1, 2, 4, 8 Bytes; es spielt keine Rolle), und ich füge sie hinzu: unterscheidet sich das Bit-für-Bit-Ergebnis der Summe, wenn sie signiert oder unsigniert sind. Mit anderen Worten: Unabhängig davon, ob sie ganzzahlige Zahlen mit oder ohne Vorzeichen sind, werden die Bits am Ende dieselben sein?

Meine Intuition und meine schwache Erinnerung sagen mir, dass sie es werden, aber ich wollte nur bestätigen. Vielen Dank.

+1

IIRC, obwohl das Ergebnis OK aussieht, besagt der C/C++ - Standard, dass Ganzzahlüberlauf zu undefiniertem Verhalten führt. ** EDIT **: Vorzeichenlose Arithmetik überläuft nicht und folgt normalerweise dem Wrap-Around. – nhahtdh

+0

@nhahtdh: danke; das ist ok. Ich habe es mit C++ getaggt, weil ich dachte, es wäre eine gute Zuhörerschaft, aber ich werde es in einer anderen Sprache verwenden. – Eduardo

+2

http://stackoverflow.com/questions/9024826/how-disastrous-is-integer-overflow-in-c – nhahtdh

Antwort

13

Angenommen, die Implementierung verwendet das Zweierkomplement als Repräsentation von Ganzzahlen mit Vorzeichen, dann sind die Ergebnisse gleich. In anderen Darstellungen werden sie nicht.

EDIT

Wie in Kommentaren darauf hingewiesen, Überlauf in signierten hinaus ist nicht definiertes Verhalten, das nichts bedeutet, über die Ergebnisse in einem solchen Fall kann gesagt werden.

+0

Ich wünschte, ich könnte Sie zweimal wählen: einmal für die Antwort und ein weiteres für die Bestätigung, dass meine Erinnerung nicht so schlecht ist :-) – Eduardo

+1

@Eduardo, werde ich in der zweiten Abstimmung pitchen. Gute, kurze, richtige Antwort. – Lindydancer

+3

Und wenn UB in der Addition aufgerufen wird, werden sie auch nicht. – PlasmaHH

4

Ich weiß, dies wurde bereits beantwortet, aber alle Prozessoren, mit denen ich jemals gearbeitet habe (etwa ein Dutzend verschiedene Architekturen - und ich meine Architekturen, nicht verschiedene Geschmacksrichtungen) haben nur eine Art von ADD-Anweisung - es kann anders haben Größenoptionen, aber es ist die eine Anweisung. Gleiches gilt für Subtraktion. Anders ist es bei Multiplikation und Division, das typischerweise Varianten für vorzeichenbehaftet und vorzeichenlos aufweist - oder erfordert, dass die Eingabe auf irgendeine Weise "signaturangepasst" wird.

Die einzigen anderen Befehle, die zwischen signed und unsigned unterscheiden, sind die bedingten Befehle, z. "Verzweigen auf weniger als" hat eine Variante für "unsigned less than" und eine Variante für "signed less than" (von denen eine normalerweise etwas anderes als "less than" heißt, wie "unten" oder "carry set") oder einige solche).

+0

Dies ist ein sehr guter Punkt - obwohl der Standard sagt, dass das Verhalten nicht definiert ist, ist es unwahrscheinlich, etwas zu tun, was die zugrundeliegende CPU-Architektur nicht tut. So rollen C und C++ nicht. –

+1

@MarkRansom Es hängt wirklich vom Kontext ab. Die Frage, die oben von nhahtdh verknüpft ist, zeigt ein Beispiel, in dem der Compiler interveniert. – Angew

+0

Ja. Natürlich kann es einige CPUs geben, die verschiedene vorzeichenbehaftete und vorzeichenlose Anweisungen für "addieren" und "subtrahieren" haben, ich muss noch eins sehen [oder sogar von einem hören]. Die C/C++ - Spezifikationen werden von Sprachanwälten geschrieben, die alle Arten von WEIRD-Hardware erfüllen müssen. Das bedeutet nicht, dass wir diese Art von Hardware sehr oft sehen werden ...;) –

Verwandte Themen