Разница между int32, int, int32_t, int8 и int8_t
Недавно я встретил тип данных int32_t
в программе C. Я знаю, что он хранит 32 бита, но не int
и int32
делают то же самое?
Кроме того, я хочу использовать char
в программе. Могу ли я использовать int8_t
вместо этого? В чем разница?
Подводя итог: какая разница между int32, int, int32_t, int8 и int8_t в C?
Ответы
Ответ 1
Между int32
и int32_t
, (а также между int8
и int8_t
) разница довольно проста: стандарт C определяет int8_t
и int32_t
, но не определяет ничего с именем int8
или int32
- последний (если они вообще существуют), вероятно, из какого-либо другого заголовка или библиотеки (скорее всего, предшествует добавлению int8_t
и int32_t
в C99).
Plain int
довольно сильно отличается от остальных. Где int8_t
и int32_t
каждый имеет заданный размер, int
может быть любого размерa >= 16 бит. В разное время, как 16 бит, так и 32 бита были достаточно распространены (и для 64-битной реализации, вероятно, должно быть 64 бита).
С другой стороны, int
гарантированно присутствует в каждой реализации C, где int8_t
и int32_t
- нет. Вероятно, можно сомневаться, имеет ли это значение для вас. Если вы используете C на небольших встроенных системах и/или более старых компиляторах, это может быть проблемой. Если вы используете его в основном с современным компилятором на настольных/серверных машинах, это, вероятно, не будет.
Упс - пропустил часть char
. Вы использовали бы int8_t
вместо char, если (и только если) вы хотите, чтобы целочисленный тип был точно размером 8 бит. Если вы хотите хранить символы, вы, скорее всего, захотите использовать char
. Его размер может варьироваться (в терминах количества бит), но он гарантированно составляет один байт. Одна небольшая странность: нет никакой гарантии, подписан ли простой char
или без знака (и многие компиляторы могут сделать это либо одно, в зависимости от флага компиляции). Если вам нужно убедиться, что он подписан или не подписан, вам необходимо явно указать это.
Ответ 2
Типы данных _t представляют собой типы typedef в заголовке stdint.h, а int - встроенный базовый тип данных. Это делает _t доступным только в том случае, если существует stdint.h. int, с другой стороны, гарантированно существует.
Ответ 3
Всегда помните, что "размер" является переменной, если явно не указано, поэтому, если вы объявляете
int i = 10;
В некоторых системах это может привести к 16-битовому целому компилятору, а для некоторых других это может привести к 32-разрядному целому (или 64-разрядному целому числу на более новых системах).
Во встроенных средах это может закончиться странными результатами (особенно при обработке ввода-вывода с отображением памяти или может рассматриваться как простая ситуация с массивом), поэтому настоятельно рекомендуется указывать фиксированные переменные размера. В устаревших системах вы можете столкнуться
typedef short INT16;
typedef int INT32;
typedef long INT64;
Начиная с C99, дизайнеры добавили файл заголовка stdint.h, который по существу использует аналогичные typedef.
В системе на базе Windows вы можете видеть записи в файле заголовка stdin.h как
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
Существует нечто большее, чем минимальное значение ширины или точная ширина целочисленных типов, я думаю, что неплохо изучить stdint.h для лучшего понимания.