2012-11-01 11 views
23

Rozmiar char, int, long double ... może się różnić w zależności od kompilatora. Ale czy mam gwarancję zgodnie ze standardem C++ 11 lub C11, że rozmiar dowolnego podpisanego i niepodpisanego podstawowego typu integralnego jest taki sam?Czy mam gwarancję, że sizeof (type) == sizeof (unsigned type)?

+0

Mam nadzieję, że tak, chyba że jest jakiś rodzaj, dla którego nierówność ma sens, w takim przypadku chętnie bym to usłyszał. – chris

+1

Tak samo na marginesie, sizeof char ma zawsze postać 1. char może mieć nietypowy rozmiar, na przykład 16 bitów, ale rozmiar sizeof nadal będzie wynosił 1, a rozmiar 32-bitowy będzie wynosił 2. –

Odpowiedz

40

C++ 11 standardowych mówi o liczbach całkowitych:

(§3.9.1/3) każdy ze standardowych podpisany typów całkowitych, istnieje odpowiadający (ale inne) stosuje się standardowe typu liczba całkowita bez znaku : "Unsigned char", "unsigned short int", "unsigned int", "unsigned long int" i "unsigned long long int", z których każdy zajmuje taką samą ilość pamięci i ma te same wymagania dotyczące wyrównania (3.11) co odpowiedni podpisany typ całkowity; oznacza to, że każdy typ liczby całkowitej ze znakiem ma taką samą reprezentację obiektu, jak odpowiadający mu typ liczby całkowitej bez znaku. Podobnie, dla każdego z rozszerzonych typów liczb całkowitych ze znakiem istnieje odpowiedni rozszerzony, niepodpisany typ całkowity z taką samą ilością wymagań dotyczących przechowywania i wyrównania. [...]

Odpowiedź brzmi "tak".

Dla C11 jest odpowiedni tu stwierdzenie (to jest z N1570)

(§6.2.5/6) Dla każdego podpisanych typów całkowitych, jest odpowiednia (ale różne) unsigned typu Integer (oznaczone słowem kluczowym unsigned), który wykorzystuje tę samą ilość magazynowania (w tym znak informacyjny) i ma takie same wymagania wyrównanie [...]

-1

Tak, nie ma pełnej gwarancji, że sizeof (typ podpisu) jest równy sizeof (unsigned type) ponieważ niepodpisany przyjmuje tylko przestrzeń ujemną liczby podpisanego typu, aby zwiększyć jej zasięg.

+1

Nic w standardzie nie nakazuje 'UINT_MAX > INT_MAX'; maszyny o jasności znaku mogą je równać. – supercat