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

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

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

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

3 ответа

Решение

Между int32 а также int32_t, (а также между int8 а также int8_t) разница довольно проста: стандарт C определяет int8_t а также int32_t, но не определяет ничего по имени int8 или же int32 - последний (если они вообще существуют), вероятно, из какого-то другого заголовка или библиотеки (скорее всего, предшествует добавлению int8_t а также int32_t в С99).

гладкий int немного отличается от других. куда int8_t а также int32_t каждый имеет определенный размер, int может быть любого размера> 16 бит. В разное время и 16, и 32 бита были достаточно распространенными (а для 64-битной реализации это, вероятно, должно быть 64 бита).

С другой стороны, int гарантированно присутствует в каждой реализации C, где int8_t а также int32_t не. Вероятно, остается открытым вопрос, имеет ли это для вас значение. Если вы используете C в небольших встроенных системах и / или старых компиляторах, это может быть проблемой. Если вы используете его в основном с современным компилятором на компьютерах с настольными компьютерами / серверами, это, вероятно, не будет

Упс - пропустил часть про char, Вы бы использовали int8_t вместо char, если (и только если) вы хотите, чтобы целочисленный тип имел размер точно 8 бит. Если вы хотите хранить символы, вы, вероятно, хотите использовать char вместо. Его размер может варьироваться (с точки зрения количества бит), но он гарантированно будет ровно один байт. Одна небольшая странность: нет никакой гарантии, что char подписан или не подписан (и многие компиляторы могут сделать его одним, в зависимости от флага времени компиляции). Если вам нужно убедиться, что он подписан или не подписан, вы должны указать это явно.

Типы данных _t являются типами typedef в заголовке stdin t.h, тогда как in t является встроенным фундаментальным типом данных. Это делает _t доступным, только если существует stdin t.h. С другой стороны, in t гарантированно существует.

Всегда имейте в виду, что "размер" является переменной, если явно не указано, так что если вы объявляете

 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 неплохо изучить.

Другие вопросы по тегам