Вопрос

Как лучше всего объявлять целочисленный тип, который всегда равен 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top