Как объявить 32-битное целое число в C - PullRequest
66 голосов
/ 04 августа 2009

Каков наилучший способ объявить целочисленный тип, который всегда равен 4 байтам на любых платформах? Я не беспокоюсь об определенном устройстве или старых машинах с 16-битным int.

Ответы [ 9 ]

104 голосов
/ 04 августа 2009
#include <stdint.h>

int32_t my_32bit_int;
12 голосов
/ 04 августа 2009

C не очень интересует точные размеры целочисленных типов, C99 вводит заголовок stdint.h , который, вероятно, является вашей лучшей ставкой. Включите это, и вы можете использовать, например, int32_t. Конечно, не все платформы могут это поддерживать.

11 голосов
/ 04 августа 2009

Ответ Кори на мой взгляд верен для «лучших», но простое «int» также будет работать на практике (учитывая, что вы игнорируете системы с 16-битным int). На данный момент так много кода зависит от того, что int 32-битный, что системные поставщики не собираются его менять.

(См. Также, почему long является 32-битным на многих 64-битных системах и почему у нас "long long".)

Однако одно из преимуществ использования int32_t заключается в том, что вы не увековечиваете эту проблему!

5 голосов
/ 03 мая 2012

Вам необходимо включить inttypes.h вместо stdint.h, поскольку stdint.h недоступно на некоторых платформах, таких как Solaris, и inttypes.h будет включать stdint.h для вас в таких системах, как Linux. Если вы включите inttypes.h, то ваш код станет более переносимым между Linux и Solaris.

Эта ссылка объясняет, что я говорю: HP ссылка о inttypes.h

И эта ссылка содержит таблицу, показывающую, почему вы не хотите использовать long или int, если у вас есть намерение указать определенное количество битов в вашем типе данных. Ссылка IBM о переносимых типах данных

5 голосов
/ 04 августа 2009

Вы могли бы выследить копию brg_types.h Брайана Гладмана, если у вас нет stdint.h.

brg_types.h откроет размеры различных целых чисел на вашей платформе и создаст определения типов для общих размеров: 8, 16, 32 и 64 бит.

0 голосов
/ 17 июня 2018

C99 или позже

Использование <stdint.h>.

Если ваша реализация поддерживает 32-разрядные целые числа, дополняющие 2, то она должна определять int32_t.

Если нет, то следующим лучшим вариантом будет int_least32_t, который является целочисленным типом, поддерживаемым реализацией, который составляет не менее 32 бит, независимо от представления (дополнение двух, дополнение одного и т. Д.).

Существует также int_fast32_t, представляющий собой целочисленный тип шириной не менее 32 бит, выбранный с целью обеспечения максимально быстрых операций для этого размера.

ANSI C

Вы можете использовать long, который гарантированно будет иметь ширину не менее 32 бит в результате требований минимального диапазона, определенных стандартом.

Если вы предпочитаете использовать наименьший целочисленный тип для размещения 32-разрядного числа, то вы можете использовать операторы препроцессора, подобные следующим, с макросами, определенными в <limits.h>:

#define TARGET_MAX 2147483647L

#if   SCHAR_MAX >= TARGET_MAX
  typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
  typedef short int32;
#elif INT_MAX   >= TARGET_MAX
  typedef int int32;
#else
  typedef long int32;
#endif

#undef TARGET_MAX
0 голосов
/ 05 августа 2009

stdint.h - очевидный выбор, но он не обязательно доступен.

Если вы используете переносимую библиотеку, возможно, она уже предоставляет переносимые целые числа фиксированной ширины. Например, SDL имеет Sint32 (S означает «подписано»), а GLib имеет gint32.

0 голосов
/ 04 августа 2009

также в зависимости от вашей целевой платформы вы можете использовать автоинструменты для вашей системы сборки

он увидит, существует ли stdint.h / inttypes.h и не создаст ли соответствующие определения типов в "config.h"

0 голосов
/ 04 августа 2009

Если stdint.h недоступен для вашей системы, создайте его самостоятельно. У меня всегда есть файл с именем «types.h», в котором есть typedefs для всех 8, 16 и 32-битных значений со знаком / без знака.

...