Какой лучший способ объявить целочисленный тип, который всегда равен 4 байтам на любых платформах? Я не беспокоюсь о некоторых устройствах или старых машинах, у которых есть 16-разрядный int
.
Как объявить 32-разрядное целое число в C
Ответ 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
.
Ответ 9
Я нашел это:
http://www.velocityreviews.com/forums/t282915-defining-a-32-bit-integer-on-every-platform.html
Может помочь.