Чи визначені такі типи, як uint32, int32, uint64, int64 у будь-якому заголовку stdlib?


94

Я часто бачу вихідний код, використовуючи такі типи, як uint32, uint64, і мені цікаво, чи їх слід визначити програмістом у коді програми чи чи вони визначені у стандартному заголовку lib.

Який найкращий спосіб мати ці типи у вихідному коді програми?

Відповіді:


135

C99 stdint.hвизначає такі:

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

І, якщо архітектура їх підтримує:

  • int64_t
  • uint64_t

Також є різні інші цілі типи дефісів stdint.h.

Якщо ви застрягли без середовища C99, то, ймовірно, вам слід надати свої власні typedefs і в будь-якому разі використовувати C99.

uint32І uint64(тобто без _tсуфікса), ймовірно , конкретне застосування.


16
Ця відповідь неправильна. Все вищезазначене доступне лише в тому випадку, якщо в реалізації існує точний тип ширини такого розміру (без прокладки). Навіть якщо, проте, типи int_leastNN_tі uint_leastNN_tдля NN8, 16, 32 і 64 повинні завжди існують . C99 не дозволяє реалізувати без цілого типу принаймні 64 біт, оскільки long longпотрібно бути принаймні таким великим.
R .. GitHub СТОП ДОПОМОГАЙТЕ

@R ..: Чи було б точніше сказати "POSIX stdint.h", а не "C99 stdint.h"?
mu занадто короткий

1
POSIX stdint.hвимагає їх усіх.
R .. GitHub СТОП ДОПОМОГАЙТЕ

1
@R .., Чи можете ви, будь ласка, відредагувати цю відповідь для правильності? Мені знадобилося трохи проаналізувати поєднання поточного вмісту та ваших коментарів.
merlin2011

SDL визначає псевдонім такий псевдонім typedef uint32_t Uint32;у include / SDL_stdinc.h (якщо ви користувач SDL)
Et7f3XIV

10

Ці цілі типи всі визначені в stdint.h


Це не stdint.hконкретна реалізація? Також дивіться це питання і це питання
Кріс Фредерік

3
Переглядаючи файл, я знайшов "ISO C99: 7.18 Цілі типи <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-бітові типи існують, якщо процесор їх підтримує.


Будь ласка, цитуйте щось із цього приводу.
BiGYaN

6
x86 не підтримує 64-бітну математику, але має 64-бітні типи.
R .. GitHub СТОП ДОПОМОГАЙТЕ

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 (тощо).

Немає стандартних заголовків - ані жодної в папці / usr / include / Linux, яка визначає їх без "_t".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.