Как объявить 32-битное целое число в C
-
22-07-2019 - |
Вопрос
Как лучше всего объявлять целочисленный тип, который всегда равен 4 байтам на любых платформах? Я не беспокоюсь об определенном устройстве или старых машинах с 16-битным int
.
Решение
#include <stdint.h>
int32_t my_32bit_int;
Другие советы
C не очень заботится о точных размерах целочисленных типов, C99 вводит заголовок stdint.h , что, вероятно, ваш лучший выбор. Включите это, и вы можете использовать, например, int32_t
. Конечно, не все платформы могут поддерживать это.
Ответ Кори корректен для " best " ;, на мой взгляд, но простой " int " также будет работать на практике (учитывая, что вы игнорируете системы с 16-битным int). На данный момент так много кода зависит от того, что int 32-битный, что системные поставщики не собираются его менять.
(См. также, почему long 32-битный на многих 64-битных системах и почему у нас есть " long long ".)
Однако одно из преимуществ использования int32_t заключается в том, что вы не увековечиваете эту проблему!
Вы могли бы выследить копию Брайана Гладмана brg_types.h
, если у вас нет stdint.h
.
<=> обнаружит размеры различных целых чисел на вашей платформе и создаст typedef для общих размеров: 8, 16, 32 и 64 бит.
Вам нужно включить inttypes.h
вместо stdint.h
, потому что long
недоступно на некоторых платформах, таких как Solaris, и int
будет включать <=> для вас в таких системах, как Linux.
Если вы включите <=>, то ваш код будет более переносимым между Linux и Solaris.
Эта ссылка объясняет, что я говорю: © >
И эта ссылка содержит таблицу, показывающую, почему вы не хотите использовать <=> или <=>, если у вас есть намерение указать определенное количество битов в вашем типе данных. ссылка IBM на переносимые типы данных
Если stdint.h недоступен для вашей системы, создайте свой собственный. У меня всегда есть файл с именем & Quot; types.h & Quot; которые имеют typedefs для всех 8, 16 и 32-битных значений со знаком / без знака.
также в зависимости от вашей целевой платформы вы можете использовать автоинструменты для вашей системы сборки
он увидит, существует ли stdint.h / inttypes.h и не создаст ли соответствующие определения типа в " config.h "
stdint.h - очевидный выбор, но он не обязательно доступен.
Если вы используете переносимую библиотеку, возможно, она уже предоставляет переносимые целые числа фиксированной ширины.
Например, SDL имеет Sint32
(S для & # 8220; подписано & # 8221;), а GLib имеет gint32
.
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