Czy typy takie jak uint32, int32, uint64, int64 są zdefiniowane w jakimkolwiek nagłówku standardowej biblioteki?

95

Często widzę kod źródłowy używający typów takich jak uint32, uint64 i zastanawiam się, czy powinny być zdefiniowane przez programistę w kodzie aplikacji, czy też są zdefiniowane w standardowym nagłówku lib.

Jaki jest najlepszy sposób na umieszczenie tych typów w kodzie źródłowym aplikacji?

philix
źródło

Odpowiedzi:

136

C99 stdint.hdefiniuje te:

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

A jeśli architektura je obsługuje:

  • int64_t
  • uint64_t

Istnieją również różne inne typy definicji całkowitych stdint.h.

Jeśli utkniesz bez środowiska C99, prawdopodobnie powinieneś dostarczyć własne typy czcionek i mimo wszystko użyć tych z C99.

Elementy uint32i uint64(tj. Bez _tprzyrostka) są prawdopodobnie specyficzne dla aplikacji.

mu jest za krótkie
źródło
16
Ta odpowiedź jest błędna. Wszystkie powyższe są dostępne tylko wtedy, gdy w implementacji istnieje dokładny typ szerokości tego rozmiaru (bez dopełnienia). Jednak nawet jeśli nie, typy int_leastNN_ti uint_leastNN_tdla NN8, 16, 32 i 64 muszą zawsze istnieć . C99 nie pozwala na implementacje bez liczby całkowitej o rozmiarze co najmniej 64 bitów, ponieważ long longmusi być co najmniej tak duża.
R .. GitHub ZATRZYMAJ SIĘ NA LODZIE
@R ..: Czy należałoby powiedzieć „POSIX stdint.h” zamiast „C99 stdint.h”?
mu jest za krótkie
1
POSIX stdint.hwymaga ich wszystkich.
R .. GitHub PRZESTAŃ POMÓC LODOWI
1
@R .., czy możesz edytować tę odpowiedź pod kątem poprawności? Trochę zajęło mi przeanalizowanie kombinacji aktualnej treści i twoich komentarzy.
merlin2011
SDL definiuje alias taki alias typedef uint32_t Uint32;w include / SDL_stdinc.h (jeśli jesteś użytkownikiem SDL)
Et7f3XIV
10

Wszystkie te typy liczb całkowitych są zdefiniowane w programie stdint.h

GWW
źródło
Czy nie jest związane z stdint.hwdrożeniem? Zobacz także to pytanie i to pytanie
Chris Frederick
3
Patrząc na plik, w komentarzach znalazłem "ISO C99: 7.18 Typy całkowite <stdint.h>". Przypuszczam, że otrzymasz, stdint.hjeśli przestrzegasz standardu C99.
philix
Nie znajduję żadnego z nich stdint.h. To zwraca 0 trafień: grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
jww
1
@jww: W moim przypadku ten plik zawiera #include "stdint-gcc.h", a grepowanie tego pliku daje definicje.
Victor Zamanian,
1
@jww tak, one nie istnieją. Jedyne, które są standardowe i które należy zdefiniować, to te z _tprzyrostkiem, wymienione w odpowiedzi powyżej.
Victor Zamanian
2

Jeśli używasz C99, po prostu dołącz stdint.h. Przy okazji, typy 64-bitowe są dostępne, jeśli procesor je obsługuje.

BiGYaN
źródło
Proszę o zacytowanie czegoś w tym zakresie.
BiGYaN
6
x86 nie obsługuje 64-bitowej matematyki, ale ma 64-bitowe typy.
R .. GitHub PRZESTAŃ POMÓC LODOWI
2
Tak. Obsługuje 32-bitowe x 32-bitowe -> 64-bitowe mnożenie, 64-bitowe / 32-bitowe -> 32-bitowy iloraz i 32-bitowy podział reszty, a także dodawanie z przenoszeniem i odejmowaniem z instrukcjami pożyczania. Został zbudowany, aby móc wykonywać arytmetykę 64-bitową, choćby dlatego, że 8086 musiał być w stanie wykonać arytmetykę 32-bitową.
Michael Morris
Istnieje również uint128_tjeśli __SIZEOF_INT128__jest zdefiniowane na 16 lub więcej (GCC i zgodne). Jest dostępny na maszynach x86_64 / amd64, ale procesor nie obsługuje go natywnie. Tylko Cray's mają ten rozmiar rejestru, IIRC.
jww
0

Pytający właściwie zapytał o int16 (itp.), A nie (brzydki) int16_t (itp.).

Nie ma standardowych nagłówków - ani żadnego w folderze / usr / include / Linuxa, które definiują je bez „_t”.

Steve
źródło