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

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

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


person philix    schedule 16.05.2011    source источник


Ответы (4)


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), вероятно, зависят от приложения.

person mu is too short    schedule 16.05.2011
comment
Этот ответ неверен. Все вышеперечисленное доступно только в том случае, если в реализации существует точный тип ширины этого размера (без заполнения). Однако даже если это не так, типы int_leastNN_t и uint_leastNN_t для NN 8, 16, 32 и 64 должны существовать всегда. C99 не допускает реализации без целочисленного типа размером не менее 64 бит, поскольку long long должен быть как минимум такого размера. - person R.. GitHub STOP HELPING ICE; 16.05.2011
comment
@R..: Было бы правильно сказать POSIX stdint.h, а не C99 stdint.h? - person mu is too short; 16.05.2011
comment
POSIX stdint.h требует их всех. - person R.. GitHub STOP HELPING ICE; 16.05.2011
comment
@R.., не могли бы вы отредактировать этот ответ для корректности? Мне потребовалось немного времени, чтобы проанализировать комбинацию текущего контента и ваших комментариев. - person merlin2011; 19.02.2017
comment
SDL определяет псевдоним, такой как typedef uint32_t Uint32;, в include/SDL_stdinc.h (если вы являетесь пользователем SDL) - person Et7f3XIV; 26.11.2019
comment
что означает суффикс _t? - person Time Killer; 26.05.2020
comment
@ RFC7676 В некоторых кругах это общепринятое обозначение типа. - person mu is too short; 26.05.2020

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

person GWW    schedule 16.05.2011
comment
Разве stdint.h не зависит от реализации? Также см. этот вопрос и этот вопрос - person Chris Frederick; 16.05.2011
comment
Глядя на файл, я нашел в комментариях ISO C99: 7.18 Целочисленные типы ‹stdint.h›. Я полагаю, вы получите stdint.h, если соблюдаете стандарт C99. - person philix; 16.05.2011
comment
Я не нахожу ни одного из них в stdint.h. Это возвращает 0 совпадений: grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t. - person jww; 30.07.2016
comment
@jww: В моем случае этот файл содержит #include "stdint-gcc.h", и поиск этого файла дает определения. - person Victor Zamanian; 16.08.2016
comment
@VictorZamanian - я все еще не нахожу их stdint-gcc.h. Есть typedef __UINT32_TYPE__ uint32_t; но ничего для uint32. То же самое относится и к uint8, uint16 и uint64 (и подписанным вариантам). - person jww; 17.08.2016
comment
@jww да, их не существует. Единственные, которые являются стандартными и которые должны быть определены, — это те, у которых есть суффикс _t, как указано в ответе выше. - person Victor Zamanian; 17.08.2016

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

person BiGYaN    schedule 16.05.2011
comment
Процитируйте что-нибудь по этому поводу. - person BiGYaN; 16.05.2011
comment
x86 не поддерживает 64-битную математику, но имеет 64-битные типы. - person R.. GitHub STOP HELPING ICE; 16.05.2011
comment
Да. Он поддерживает 32-разрядное x 32-разрядное -> 64-разрядное умножение, 64-разрядное / 32-разрядное -> 32-разрядное частное и 32-разрядное деление остатка, а также сложение с переносом и вычитание с инструкциями заимствования. Он был создан, чтобы иметь возможность выполнять 64-битные арифметические операции хотя бы потому, что 8086 должен был иметь возможность выполнять 32-битные арифметические операции. - person Michael Morris; 08.04.2014
comment
Существует также uint128_t, если __SIZEOF_INT128__ определено как 16 или больше (GCC и совместимые). Он доступен на машинах x86_64/amd64, но процессор изначально его не поддерживает. Только Cray имеет такой размер регистра, IIRC. - person jww; 17.08.2016

Спрашивающий на самом деле спрашивал о int16 (и т. д.), а не (уродливом) int16_t (и т. д.).

Стандартных заголовков нет, как и в папке Linux /usr/include/, которые бы определяли их без «_t».

person Steve    schedule 06.04.2018