2015-03-24 3 views
5

Ich denke, es ist ein Fehler das Vorzeichenbit für Integer-Typen in Abschnitt 6.2.6.2 der ISO/IEC 9899:TC3 C standardIst das ein Fehler bei der Definition des Vorzeichenbits für Integer-Typen im C-Standard?

Für signierte Integer-Typen beschreibt, werden die Bits der Objektdarstellung in drei Gruppen unterteilt werden: Wert Bits, Füllbits und das Zeichen Bit. Es muss keine Füllbits geben; es soll genau ein Vorzeichenbit sein. Jedes Bit, das ein Wertbit ist, muss denselben Wert wie das gleiche Bit in der Objektdarstellung des entsprechenden vorzeichenlosen Typs haben (wenn M-Wert-Bits im Typ mit Vorzeichen und N in der Typ ohne Vorzeichen sind, dann M ≤ N)). Wenn das Vorzeichen-Bit Null ist, soll es den resultierenden Wert nicht beeinflussen . Wenn das Vorzeichen-Bit ist, so ist der Wert in einer der folgenden Weisen modifiziert:

  • der entsprechende Wert mit Vorzeichenbit 0 negiert wird (Vorzeichen und Größe);
  • das Vorzeichenbit hat den Wert - (2^N) (Zweierkomplement);
  • das Vorzeichenbit die Wert - (2^N - 1) (einerkomplement)

Im vorigen Abschnitt wurde N definiert die Anzahl der Wertbits in dem signierten Typ zu sein, aber hier ist es die Anzahl der Wert-Bits im unsigned Typ. Der Fall von signed char mit 8 Bits pro Byte und Zweierkomplement bedeutet, dass das Vorzeichenbit den Wert - (2^8) = -256 statt - (2^7) = -128 hat.

ich denke, die Norm sollte entweder der Schalter M und N in der Anfangs Absatz oder die Definition des Vorzeichenbits ändern M zu verwenden:

  • das Vorzeichen-Bit hat den Wert - (2^M) (Zweierkomplement);
  • das Vorzeichen-Bit hat den Wert - (2^M - 1) (Ergänzung Einsen)

Habe ich etwas übersehen, oder ist das ein Fehler?

+4

Die gemeinnützige (und wahrscheinlich richtig, soweit Vorsatz betrifft) Interpretation (wenn es M-Wert-Bits in der signierten Typ- und N in dem Typ ohne Vorzeichen, dann M < = N ist) ist dass die erste Definition von * N * in Absatz 1 für den gesamten Abschnitt gelten soll, * außer * für die in Absatz 2 enthaltene Bemerkung in Klammern, wobei * N * (und * M *) vorübergehend eine andere Definition erhält. Aber ja, es ist bestenfalls mehrdeutig. Tadeln Sie es auf Englisch mit solch schlechten variablen Scoping-Regeln. –

Antwort

6

Im C11 draft standard (Jonathan Leffler bestätigt der endgültige Standard enthält auch diese Formulierung) es in der Tat aus schaltet mit NM zu verwenden:

  • das Vorzeichen-Bit hat den Wert - (2 M) (Zweierkomplement);
  • das Vorzeichenbit hat den Wert - (2 M - 1) (Einerkomplement).

Ich kann keinen Defekt Bericht finden, aber diese hängt davon ab, ob:

Wenn es N-Wert Bits

von Absatz 1 auch Absatz gilt 2 die nicht eine unangemessene Interpretation ist es nur höchst zweideutig gegeben:

wahrscheinlich

+0

Danke für die nette Antwort. Aber ich denke, nur wir Programmierer könnten denken, dass die zweite Definition von N Schatten die erste nur innerhalb der Parens ist :) –

+0

Der letzte C11-Standard verwendet - (2^M) und - (2^M-1) auch. –

+0

@ JonathanLeffler danke, aktualisierte meine Antwort –

Verwandte Themen