Різниця між int32, int, int32_t, int8 та int8_t


103

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

Також я хочу використовувати charв програмі. Чи можна використовувати int8_tзамість цього? Яка різниця?

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

Відповіді:


122

Між 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гарантовано буде присутній у кожній реалізації С, де int8_tі int32_tні. Напевно, відкрито питання, чи це має значення для вас. Якщо ви використовуєте C для невеликих вбудованих систем та / або старих компіляторів, це може бути проблемою. Якщо ви використовуєте його головним чином із сучасним компілятором на настільних / серверних машинах, це, мабуть, не буде.

На жаль, пропустили частину о char. Ви б використовували int8_tзамість char, якщо (і лише якщо) ви хочете, щоб цілий тип гарантовано був розміром рівно 8 біт. Якщо ви хочете зберігати символи, ви, ймовірно, хочете використовувати charзамість цього. Її розмір може змінюватись (за кількістю біт), але гарантовано, що це точно один байт. Однак одна незначна дивна ситуація: немає гарантії щодо того, чи є звичайна charпідписана чи неподписана (і багато компіляторів можуть зробити її або однією, залежно від прапора часу компіляції). Якщо вам потрібно переконатися, що він підписаний або непідписаний, вам це потрібно чітко вказати.


1
@linuxfreak: Не впевнений у цьому bool_t- ніколи раніше не чув про це. Стандарт С визначає _Boolяк вбудований тип. boolвизначається лише в тому випадку, якщо ви #include <stdbool.h>(як макрос, який розширюється на _Bool).
Джеррі Труну

5
Ви сказали, що "для 64-розрядної реалізації (int), мабуть, має бути 64 біт". На практиці, int є 32-бітним на всіх поширених 64-бітних платформах, включаючи Windows, Mac OS X, Linux та різні аромати UNIX. Один виняток - Cray / UNICOS, але сьогодні вони вийшли з моди.
Сем Уоткінс

6
@SamWatkins: Так, саме тому я ретельно сказав "має бути", а не "є". Стандарт каже, що це "природний розмір, запропонований архітектурою", що (IMO) означає для 64-розрядного процесора, він дійсно повинен мати 64 біти (хоча, на краще чи гірше, ви цілком вірні, що зазвичай це не так " т). З більш практичної точки зору, це дуже зручно мати тип 32-бітну між типами в C89, і якщо ІНТ 64 біт, довго повинен бути принаймні 64 біта теж, так що не було б часто бути не 32-біт тип.
Джеррі Труну

2
@barlop: Так. (І C, і C ++ призначають мінімальний діапазон у 255 значень для char, тому для цього потрібно принаймні 8 біт, але може бути і більше).
Джеррі Труну

2
Я завжди мав враження, що один байт - це рівно 8 біт, а не десь 8 розрядів
ErlVolton

18

Типи даних _t - це типи typedef у заголовку stdint.h, тоді як int - це вбудований фундаментальний тип даних. Це робить _t доступним лише за наявності stdint.h. інт, з іншого боку, гарантовано існує.


1
Чому можна використовувати ті _t?
Deven

@Deven Щоб уникнути випадків, коли ваш код працює десь, а не десь.
Франклін Ю

2

Завжди майте на увазі, що "розмір" є змінним, якщо не вказано прямо, тому якщо ви заявляєте

 int i = 10;

У деяких системах це може призвести до 16-бітного цілого числа компілятором, а в деяких інших - 32-бітним цілим числом (або 64-бітним цілим числом у нових системах).

У вбудованих середовищах це може спричинити за собою дивні результати (особливо під час обробки пам’яті з картографічним входом / виводом або може вважатися простою ситуацією з масивом), тому настійно рекомендується вказувати змінні фіксованого розміру. У застарілих системах ви можете зіткнутися

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 

Починаючи з C99, дизайнери додали заголовок stdint.h, який по суті використовує схожі типи.

У системі 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 для кращого розуміння.


1
У вашому коді написано помилку:, typedef short INT16;ні typedefs short INT16.
Галактика
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.