Определены ли такие типы, как uint32, int32, uint64, int64 в каком-либо заголовке stdlib?

95

Я часто вижу исходный код, использующий такие типы, как uint32, uint64, и мне интересно, должны ли они определяться программистом в коде приложения или они определены в стандартном заголовке библиотеки.

Как лучше всего включить эти типы в исходный код моего приложения?

Филикс
источник

Ответы:

136

C99 stdint.hопределяет это:

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

И, если архитектура их поддерживает:

  • int64_t
  • uint64_t

Также существуют различные другие определения целочисленных типов stdint.h.

Если вы застряли без среды C99, вам, вероятно, следует предоставить свои собственные typedef и в любом случае использовать C99.

Символы uint32и uint64(т.е. без _tсуффикса), вероятно, относятся к конкретному приложению.

mu слишком короткий
источник
16
Это неверный ответ. Все вышеперечисленное доступно только в том случае, если в реализации существует точный тип ширины этого размера (без заполнения). Однако, даже если нет, типы int_leastNN_tи uint_leastNN_tдля NN8, 16, 32 и 64 должны существовать всегда . C99 не допускает реализации без целочисленного типа не менее 64 бит, так long longкак он должен быть не менее такого размера.
R .. GitHub НЕ ПОМОГАЕТ ICE
@R ..: Будет ли правильнее сказать «POSIX stdint.h», а не «C99 stdint.h»?
mu слишком короткий
1
POSIX stdint.hтребует их всех.
R .. GitHub НЕ ПОМОГАЕТ ICE
1
@R .., не могли бы вы отредактировать этот ответ для правильности? Мне потребовалось немного времени, чтобы проанализировать комбинацию текущего контента и ваших комментариев.
merlin2011
SDL определяет псевдоним, такой как псевдоним, typedef uint32_t Uint32;в include / SDL_stdinc.h (если вы являетесь пользователем SDL)
Et7f3XIV,
10

Все эти целочисленные типы определены в stdint.h

GWW
источник
Не зависит от stdint.hреализации? Также см. Этот вопрос и этот вопрос
Крис Фредерик
3
Глядя на файл, я обнаружил в комментариях «ISO C99: 7.18 Integer types <stdint.h>». Я полагаю, вы получите, stdint.hесли соблюдаете стандарт C99.
Филикс
Я не нахожу ни одного из них stdint.h. Это возвращает 0 хиты: grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
jww
1
@jww: В моем случае этот файл содержит #include "stdint-gcc.h", и поиск в этом файле дает определения.
Виктор Заманян
1
@jww да, их не существует. Единственные стандартные, которые следует определить, это те, которые имеют _tсуффикс, как указано в ответе выше.
Виктор Заманян
2

Если вы используете C99, просто включите stdint.h. Кстати, 64-битные типы есть, если процессор их поддерживает.

БиГЯН
источник
Пожалуйста, процитируйте что-нибудь по этому поводу.
БиГЯН
6
x86 не поддерживает 64-битную математику, но имеет 64-битные типы.
R .. GitHub НЕ ПОМОГАЕТ ICE
2
Да. Он поддерживает 32-битное x 32-битное -> 64-битное умножение, 64-битное / 32-битное -> 32-битное частное и 32-битное деление остатка, а также добавление с переносом и вычитание с инструкциями заимствования. Он был построен для выполнения 64-битной арифметики хотя бы потому, что 8086 должен был уметь выполнять 32-битную арифметику.
Майкл Моррис
Также существует uint128_tif __SIZEOF_INT128__, равный 16 или выше (GCC и совместимые). Он доступен на машинах x86_64 / amd64, но процессор изначально не поддерживает его. Только Cray имеют такой размер регистра, IIRC.
jww
0

Вопросник на самом деле спросил о int16 (и т. Д.), А не о (уродливом) int16_t (и т. Д.).

Нет стандартных заголовков - и в папке Linux / usr / include /, которые определяли бы их без "_t", нет.

Стив
источник