Przeczytam Język programowania C++, aw nim Stroustrup stwierdza, że wartość int znaku może być w zakresie od 0 do 255 lub od -127 do 127, zależnie od implementacji. Czy to jest poprawne? Wygląda na to, że powinna wynosić od -128 do 127. Jeśli nie, to ich jedyne 255 możliwych wartości w drugiej możliwości implementacji, nie 256.dla wartości całkowitych znaków w C++
Odpowiedz
Utknąłeś w myśleniu two's complement - Standard C++ nie definiuje reprezentacja używana dla liczb ujemnych!
Jeśli Twój komputer (nie daj Boże) używa ones's complement do reprezentowania liczb ujemnych, masz zakres od -127 do + 127 w 8-bitowym bajcie. Z drugiej strony masz dwie różne reprezentacje na zero ...
Jednak w świecie rzeczywistym you're unlikely to meet a one's complement computer.
Dobra uwaga. Zapomniałem o kompilacji 1: –
Od czytania wydaje się, że może to być dowolny z nich, w zależności od implementacji.
Dzięki Roddy i Esteban Brenes za pomocne odpowiedzi.
To jest moje obecne rozumienie:
Istnieją trzy możliwości. Jeśli wartości są reprezentowane jako unsigned, znak będzie w zakresie od 0 do 255. Jeśli wartości są reprezentowane jako podpisane w dopełnieniu dwóch, znak będzie w zakresie od -128 do 127. Wreszcie, jeśli wartości są reprezentowane jako podpisane w jednym uzupełnieniu , znak będzie w zakresie od -127 do 127. Ta ostatnia możliwość sugeruje, że istnieje tylko 255 możliwych wartości w przeciwieństwie do 256 możliwych wartości dla pierwszych dwóch implementacji, ale nie uwzględnia to ujemnego zera w swoich reprezentacjach uzupełnień .
Niewłaściwe jest myślenie, że niepodpisany znak ma zakres od 0 do 255. To tylko jego minimalny zasięg. char musi mieć co najmniej 8 bitów, a znak char, unsigned char i char mogą mieć nawet więcej niż 8 bitów. tak więc oznacza to, że unsigned char może przekroczyć 255. choć wprawdzie nie mam implementacji, która ma więcej niż 8 bitów, teoretycznie jest to możliwe. jest to określone w standardzie c89 (na którym bazują C++ 03), dokumentowanie plików limits.h (CHAR_BIT, UCHAR_MAX, CHAR_MAX).
To prawda. Pracowałem z osadzonymi procesorami DSP, w których char, short, int i long są 32-bitowe. – ChrisN
Ponieważ norma nie mówi nic o typie char "char" mogą być:
"unsigned char" (0-255) w niektórych kompilatorów (Przykład: Texas Instruments kompilatora ich ARM procesory - seria OMAP)
"podpisane char" (-128-127) na większości kompilatorów (gCC, MSVC ...)
Aby upewnić się, że zawsze mają dobrze zdefiniowany zakres zalecana posługiwać się "signed char" lub "unsigned char".
czy masz pojęcie, dlaczego zakres liczby całkowitej wynosi od -128 do 127, a nie od -127 do 128? – user1437027