2015-03-24 12 views
5

myślę, że to błąd opisując trochę znak dla typów całkowitych w punkcie 6.2.6.2 z ISO/IEC 9899:TC3 C standardCzy jest to błąd w definicji bit znaku dla typów całkowitych w standardzie C?

dla podpisanych typów całkowitych, bity reprezentacji obiektu będą być podzielone na trzy grupy: bitów wartości, bity dopełniające i bit znaku . Nie musi być żadnych kawałków dopełniających; będzie dokładnie jeden bit znaku . Każdy bit, który jest bitem wartości, ma tę samą wartość, co , ten sam bit w reprezentacji obiektu odpowiedniego typu niepodpisanego (jeśli w podpisanym typie jest bitów o wartości M, a N w typu bez znaku, to M ≤ N). Jeżeli bit znaku wynosi zero, nie ma wpływu na wynikową wartość. Jeśli bit znaku ma wartość jeden, wartość jest zmodyfikowane na jeden z następujących sposobów:

  • odpowiednia wartość bitu znaku 0 jest negowany (znak i rozmiarów);
  • bit znaku ma wartość - (2^N) (uzupełnienie dwóch);
  • bit znaku ma wartość - (2^n - 1) (kod uzupełnień do jedności)

w poprzedniej sekcji, N zdefiniowano jako liczbę bitów wartości w podpisanego typu ale tutaj jest liczba bitów wartości w typie unsigned.

W przypadku signed char z 8 bitami na bajt i dopełnienie dwóch, to znaczy, że bit znaku ma wartość - (2^8) = -256 zamiast - (2^7) = -128.

myślę, że standard powinien albo przełączyć M i N w pierwszym akapicie lub zmienić definicję bitu znaku użyć M:

  • bit znaku ma wartość - (2^M) (uzupełnienie dwójki);
  • bit znaku ma wartość - (2^M - 1) (kod uzupełnień do jedności)

Coś mnie ominęło, czy jest to błąd?

+4

Najbardziej dobroczynne (i prawdopodobnie były w miarę intencją dotyczy) interpretacji prawdopodobnie że pierwsza definicja * N * w ust. 1 ma dotyczyć całej sekcji, * z wyjątkiem * dla uwagi w nawiasie w ust. 2, gdzie * N * (i * M *) mają tymczasowo inną definicję. Ale tak, w najlepszym razie jest to nieco dwuznaczne. Obwiniaj to po angielsku o tak słabych regułach ustalania zakresu. –

Odpowiedz

6

W C11 draft standard (Jonathan Leffler potwierdza ostateczny standard zawiera również tego sformułowania) rzeczywiście ma przejść z używania N użyciem M:

  • bit znaku ma wartość - (2 M) (uzupełnienie dwóch);
  • bit znaku ma wartość - (2 M - 1) (uzupełnienie).

nie mogę znaleźć raport awaryjności, ale to zależy od tego, czy:

Jeśli istnieją bity wartości N

z ust 1 Odnosi się to również do ust 2 który nie jest nierozsądna interpretacja jest po prostu wysoce niejednoznaczna:

(jeśli istnieją bitów wartości m w podpisanym rodzaju i N w unsigned, wówczas M < = N)

+0

Dzięki za miłą odpowiedź. Ale myślę, że tylko nas programiści mogliby pomyśleć, że druga definicja N cienia jest pierwsza tylko wewnątrz parens :) –

+0

Ostateczny standard C11 używa - (2^M) i - (2^M-1) też. –

+0

@ JonathanLeffler dziękuję, zaktualizowałem moją odpowiedź –

Powiązane problemy