Nie, średnia C określa minimalne rozmiary dla integralnych typach, ale nie daje żadnych gwarancji na maksymalnych rozmiarach.
Implementacja powinna zapewniać typy intN_t
, jeśli typy o tym rozmiarze są dostępne. Wspominam tylko, że ponieważ masz tag między platformami - implementacja, która nie ma typu poprawnej szerokości bitowej, nie musi podawać tych typów.
Zazwyczaj można wybrać (z ustawieniami definiującymi, na przykład, cc -D_INT16_IS_INT
i #ifdef
s) poprawny typ, którego należy użyć dla określonego rozmiaru bitowego. Możesz opracować wymagane definicje dla każdej platformy, którą chcesz obsłużyć kodem C, używając CHAR_BIT
i sizeof()
.
odpowiedniej części projektu C1X (n1362) wynosi:
7.18.1.1 Dokładna szerokości liczby całkowite
Nazwa typedef intN_t
oznacza podpisaną typu liczba całkowita szerokość N
, brak bitów dopełnienia i reprezentacja uzupełnienia dwójki. Tak więc, int8_t
oznacza liczbę całkowitą ze znakiem, o szerokości dokładnie 8 bitów.
Nazwa typedef uintN_t
oznacza niepodpisany typ całkowity o szerokości N
. Tak więc, uint24_t
oznacza niepodpisany typ liczby całkowitej o szerokości dokładnie 24 bitów.
Te typy są opcjonalne. Jeśli jednak implementacja zapewnia typy całkowite o szerokości 8, 16, 32 lub 64-bitowe, bez bitów dopełniających i (dla typów podpisanych), które mają reprezentację uzupełnienia dwójkowego, to musi zdefiniować odpowiednie nazwy typedef.
dotyczące doboru rodzaju, coś jak to powinno wystarczyć:
#ifdef INT32_IS_SHORT
typedef short INT32
#endif
#ifdef INT32_IS_INT
typedef int INT32
#endif
#ifdef INT32_IS_LONG
typedef long INT32
#endif
Twoje pytanie jest bardzo podobne do http://stackoverflow.com/questions/126279/c99-stdint-h-header-and-ms-visual-studio –
@zilgo: Odpowiedź może być podobna; pytanie nie jest. W 126279 OP jest już świadomy stdint.h; NawaMan (widocznie) nie był, gdy zadaje pytanie. –
Pamiętaj, że twoje ostatnie założenie jest błędne. Różnice w rozmiarze int niekoniecznie blokują kompilację na innych architekturach, ale ukryte założenia, takie jak 'i == i & 0xFFFFFFFF' mogą. Dobry programista pisze 'i 0xFFFF' kiedy chce matematyki modulo 2^16, i nie dba o to, czy' unsigned short' ma dokładnie 16 bitów. – MSalters