Как объявить 32-разрядное целое число в C

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

Ответ 1

#include <stdint.h>

int32_t my_32bit_int;

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

он увидит, существует ли stdint.h/inttypes.h, и если они не будут создавать соответствующие typedefs в файле config.h

Ответ 8

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

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