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?
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. –