Frage

Ich bin der Gestaltung einer Sprache, und zu versuchen, zu entscheiden, ob true 0x01 oder 0xFF sein sollte. Offensichtlich sind alle Nicht-Null-Werte werden in true umgewandelt werden, aber ich versuche, über die genaue interne Darstellung zu entscheiden.

Was sind die Vor- und Nachteile für jede Wahl?

War es hilfreich?

Lösung

0 ist falsch, weil der Prozessor einen Flag hat, das gesetzt wird, wenn ein Register auf Null gesetzt wird.

Keine andere Flaggen werden auf einem anderen Wert gesetzt (0x01, 0xff, etc.) - aber der Null-Flag auf false gesetzt wird, wenn es gibt einen Wert ungleich Null in dem Register

So die hier Antworten definieren 0 als falsch und alles befürworten anderes als wahr korrekt sind.

Wenn Sie für wahr einen Standardwert „definieren“, dann 0x01 ist besser als die meisten:

  • Sie stellt die gleiche Anzahl in jedem Bit-Länge und Signedness
  • Es erfordert nur zu Test eines Bit, wenn Sie wollen wissen, ob es wahr ist, sollte der Null-Flag nicht zur Verfügung steht, oder teuer verwenden,
  • Keine Notwendigkeit, über Vorzeichenerweiterung bei der Umstellung auf andere Arten zu kümmern
  • Logische und arithmetische Ausdrücke wirken, um das gleiche drauf

-Adam

Andere Tipps

Es spielt keine Rolle, solange sie die Regeln für die Außendarstellung entspricht.

Ich würde einen Hinweis von C nimmt hier, wo falsch absolut als 0 definiert ist, und wahr ist nicht falsch definiert. Dies ist eine wichtige Unterscheidung, wenn auf einen absoluten Wert für wahr verglichen. Sofern Sie einen Typ haben, die nur zwei Zustände hat, müssen Sie innerhalb dieser Werttyp für alle Werte berücksichtigen, was wahr ist und was falsch ist.

Warum entscheiden Sie sich, dass Nicht-Null-Werte wahr sind? In Ada wahr ist wahr und falsch ist FALSCH. Es gibt keine implizite Typumwandlung zu und von BOOLEAN.

Mit -1 hat einen Vorteil in einer schwach typisierte Sprache - wenn Sie vermasseln und verwenden Sie die bitweise and Operator anstelle des logischen and Operator, Ihr Zustand noch richtig einschätzen wird, solange einer der Operanden umgewandelt worden zu die kanonische Boolesche Darstellung. Dies gilt nicht, wenn die kanonische Darstellung ist 1.

  0xffffffff & 0x00000010 == 0x00000010 (true)
  0xffffffff && 0x00000010 == 0xffffffff (true)

und

  0x00000001 & 0x00000010 == 0x00000000 (false)
  0x00000001 && 0x00000010 == 0xffffffff (true)

IMO, wenn Sie mit haften möchten false = 0x00, sollten Sie 0x01 verwenden. 0xFF ist in der Regel:

  • ein Zeichen dafür, dass eine Operation überschwemmt

oder

  • ein Fehler Marker

Und in beiden Fällen bedeutet dies wahrscheinlich, false . Daraus ergibt sich die * nix Rückgabewert Konvention von ausführbaren Dateien, die true = 0x00 und jeder Nicht-Null-Wert ist falsch.

-1 ist länger als 1 eingeben ...

Am Ende ist es egal, da 0 falsch ist und alles, was wahr ist, und Sie werden nie auf die genaue Darstellung der wahren vergleichen.

Bearbeiten, für die nach unten Abstimmung, bitte erklären, warum. Diese Antwort ist im Wesentlichen die gleiche wie die zur Zeit bei +19 bewertet. Das ist also 21 Stimmen Unterschied für das, was ist die gleiche grundlegende Antwort.

Wenn es wegen des -1 Kommentars, es ist wahr, die Person, die tatsächlich „true“ definiert (zB: der Compiler Schriftsteller) wird zu verwenden, hat -1 statt 1, vorausgesetzt, sie wählte eine verwenden, exakte Darstellung. -1 wird länger als 1 eingeben nehmen, und das Endergebnis wird das gleiche sein. Die Aussage ist dumm, es gemeint war, dumm zu sein, weil es keinen wirklichen Unterschied zwischen den beiden ist (1 oder -1).

Wenn Sie etwas markieren nach unten zumindest vor, eine Begründung dafür werden.

0xff eine ungerade Wahl, da es eine implizite Annahme hat, dass 8 Bits Ihre minimale Speichereinheit ist. Aber es ist nicht ungewöhnlich, dass Boolesche Werte speichern zu wollen, kompakter als das.

Vielleicht möchten Sie durch das Denken über neu zu formulieren, ob Booleschen Operatoren etwas produzieren, die nur eine 0 oder 1 Bit (die unabhängig von Zeichen Erweiterung funktioniert), oder ist alles Nullen oder lauter Einsen (abhängig von der Vorzeichenerweiterung von unterzeichnet Zweierkomplement-Mengen alle-onen in beliebiger Länge zu halten).

Ich denke, Ihr Leben ist einfacher, mit 0 und 1.

Die Profis sind keine, und die Nachteile sind keine, auch. Solange Sie eine automatische Konvertierung von Integer in boolean liefern, wird es willkürlich sein, so ist es wirklich egal, welche Zahlen Sie wählen.

Auf der anderen Seite, wenn Sie nicht diese automatische Konvertierung zuließ Sie ein Profi haben würde: Sie würde nicht etwas völlig willkürliche Regel in Ihrer Sprache haben. Sie würden nicht (7 - 4 - 3) == false haben oder 3 * 4 + 17 == "Hello" oder "Hi mom!" == Complex(7, -2).

Ich denke, die C-Methode ist der Weg zu gehen. 0 bedeutet falsch, etwas anderes bedeutet wahr. Wenn Sie mit einem anderen Mapping für wahr gehen, dann sind Sie mit dem Problem links unbestimmte Werte aufweisen -., Die weder wahr noch falsch sind

Wenn diese Sprache ist, die Sie für einen bestimmten Befehlssatz kompilieren, die für eine bestimmte Darstellung besondere Unterstützung hat, dann würde ich das Führungs Sie lassen. Aber fehlen zusätzliche Informationen für einen ‚Standard‘ interne Darstellung, würde ich gehen mit -1 (alle 1'en in binär). Dieser Wert reicht weit auf, was Größe boolean Sie wollen (einzelnes Bit, 8-bit, 16, usw.), und wenn Sie ein „TRUE“ oder „FALSE“ in einen kleineren „TRUE“ oder „FALSE“, die immer noch brechen das Gleiche. (Wo, wenn Sie brach ein 16-Bit TRUE = 0x0001 Sie ein FALSE = 0x00 und ein TRUE = 0x01 bekommen würde).

die Sprache so auszugestalten, dass 0 ist falsch und nicht Null ist wahr. Es besteht keine Notwendigkeit zu „konvertieren“ etwas, und denken: „Nicht-Null“ anstelle von einem spezifischen Wert wird Ihnen helfen, den Code richtig schreiben.

Wenn Sie integrierten Symbole wie „True“ dann gehen Sie vor und einen Wert auswählen, aber denken Sie immer „nicht Null ist wahr“ anstelle von „0x01 ist wahr“.

Was auch immer Sie tun, wenn Sie Ihre Werte wählen sie nicht ändern. In FORTH-77, wahr und falsch als 1 und 0. Dann definiert wurden, FORTH-83 neu definiert sie als -1 und 0 gab es nicht wenige (gut ok, nur wenige, diese FORTH ist wir reden) Probleme dadurch verursachte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top