2008-11-04 17 views
12

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++

+0

czy masz pojęcie, dlaczego zakres liczby całkowitej wynosi od -128 do 127, a nie od -127 do 128? – user1437027

Odpowiedz

15

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.

+0

Dobra uwaga. Zapomniałem o kompilacji 1: –

0

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ń .

+0

Prawie: unsigned idzie od 0 do 255, nie 256. Nigdy nie pracowałem na maszynie z dodatkiem 1 tak, więc dokładnie o tym, jak działa +0 i -0. Spodziewałbym się z perspektywy C, że nigdy nie można odróżnić – Roddy

+0

dzięki za poprawkę – 108

3

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).

+0

To prawda. Pracowałem z osadzonymi procesorami DSP, w których char, short, int i long są 32-bitowe. – ChrisN

1

Ponieważ norma nie mówi nic o typie char "char" mogą być:

  1. "unsigned char" (0-255) w niektórych kompilatorów (Przykład: Texas Instruments kompilatora ich ARM procesory - seria OMAP)

  2. "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".