2009-04-01 12 views
5

Kürzlich wurde ich von this question verwirrt. Vielleicht, weil ich keine Sprachspezifikationen gelesen habe (es ist meine Schuld, ich weiß).Compiler und negative Zahlen Darstellungen

Der C99-Standard sagt nicht, welche negative Zahlenrepräsentation vom Compiler verwendet werden soll. Ich dachte immer, dass der einzig richtige Weg, negative Zahlen zu speichern, das Zweierkomplement ist (in den meisten Fällen).

Also hier ist meine Frage: Kennen Sie irgendeinen heutigen Compiler, der standardmäßig die Darstellung des Einerkomplements oder der Zeichengröße implementiert? Können wir die Standarddarstellung mit einem Compiler-Flag ändern?

Was ist der einfachste Weg zu bestimmen, welche Darstellung verwendet wird?

Und was ist mit C++ Standard?

+0

mehr darüber in den Fragen lesen Ich denke, man könnte bestimmen, welche Implementierung durch Prüfen der binären eines signierten Wert für seine Darstellung verwendet wird, ähnlich wie endianness Kontrollen erledigt. Dies könnte wahrscheinlich in einer # define durchgeführt und zur Kompilierzeit ausgewertet werden. – slipperyseal

+0

ich meine, wenn Sie dieses Problem in den letzten 6 Jahren nicht gelöst haben. : o – slipperyseal

+0

[Ist ein Komplement ein echtes oder nur ein historisches Problem?] (https://stackoverflow.com/q/161797/995714) –

Antwort

5

Ich denke, es ist nicht so sehr eine Frage, welche Darstellung der Compiler verwendet, sondern welche Darstellung die zugrunde liegende Maschine verwendet. Der Compiler wäre sehr dumm, eine Repräsentation auszuwählen, die nicht von der Zielmaschine unterstützt wird, da dies eine Menge Overhead für keinen Vorteil bringen würde.

Einige Prüfsummenfelder in der IP-Protokoll-Suite verwenden das eigene Komplement, also vielleicht dedizierte "Netzwerk-Beschleuniger" -Typ CPU: s implementieren es.

+0

Gibt es C-Compiler für "Netzwerkbeschleuniger" -Typ CPUs? – klew

+0

@klew: Nicht, dass ich nach ein paar intensiven Minuten Googeln finden könnte, aber das beweist nicht viel. :) – unwind

1

Während twos-complement Darstellung bei weitem am häufigsten ist, ist es nicht die einzige (see some). Die C- und C++ - Standardisierungskomitees wollten keine Nicht-Zweierkomplement-Maschinen erfordern, um eine nicht-native Repräsentation zu emulieren. Daher benötigt weder C nicht C++ ein bestimmtes negatives Ganzzahlformat.

Dies führt zu dem undefinierten Verhalten von bitweisen Operationen auf Typen mit Vorzeichen.

+0

Ja, aber darum geht es mir nicht. Kennen Sie einen C-Compiler, der standardmäßig nicht-komplementär ist? – klew

+0

Diejenigen für Systeme, die Nicht-Tows-Komplement verwenden ... Was offensichtlich eine Unisys-Box enthält, die immer noch unterstützt wird (dies könnte im zweiten Link aufgeführt sein). – Richard

Verwandte Themen