Подтвердить что ты не робот

Разница между int32, int, int32_t, int8 и int8_t

Недавно я встретил тип данных int32_t в программе C. Я знаю, что он хранит 32 бита, но не int и int32 делают то же самое?

Кроме того, я хочу использовать char в программе. Могу ли я использовать int8_t вместо этого? В чем разница?

Подводя итог: какая разница между int32, int, int32_t, int8 и int8_t в C?

4b9b3361

Ответ 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 для лучшего понимания.