Який найкращий спосіб оголосити цілочисельний тип, який завжди становить 4 байти на будь-яких платформах? Мене не турбує певний пристрій чи старі машини, які мають 16-розрядну версію int
.
Який найкращий спосіб оголосити цілочисельний тип, який завжди становить 4 байти на будь-яких платформах? Мене не турбує певний пристрій чи старі машини, які мають 16-розрядну версію int
.
Відповіді:
#include <stdint.h>
int32_t my_32bit_int;
<inttypes.h>
` чітко задокументовано, щоб включати заголовок ' <stdint.h>
' (це незвично для заголовків C), але <inttypes.h>
заголовок ` ` може бути доступний там, де ' <stdint.h>
' немає, і може бути кращим вибором для перенесення. <stdint.h>
Заголовок ' ' є винаходом комітету зі стандартів і створений таким чином, що окремі реалізації C (на відміну від розміщених реалізацій - звичайних) також повинні підтримувати лише ` <stdint.h>
` і не обов'язково ' <inttypes.h>
' (це також означало б підтримка ' <stdio.h>
', що в іншому випадку не є необхідним).
uint32_t
.
На мою думку, відповідь Корі є правильною для "найкращого", але простий "int" також спрацює на практиці (враховуючи те, що ви ігноруєте системи з 16-бітовим int). На даний момент стільки коду залежить від того, чи є 32-розрядний, що постачальники системи не збираються його змінювати.
(Дивіться також, чому long - це 32-розрядна версія для багатьох 64-розрядних систем і чому ми маємо "long long".)
Однак однією з переваг використання int32_t є те, що ви не продовжуєте цю проблему!
Ви можете вишукати копію Брайана Гладмана, brg_types.h
якщо у вас її немаєstdint.h
.
brg_types.h
виявить розміри різних цілих чисел на вашій платформі та створить typedefs для загальних розмірів: 8, 16, 32 та 64 біта.
Вам потрібно включити inttypes.h
замість цього, stdint.h
оскільки stdint.h
він недоступний на деяких платформах, таких як Solaris, і inttypes.h
включить stdint.h
для вас у таких системах, як Linux. Якщо ви включите, inttypes.h
то ваш код є більш портативним між Linux і Solaris.
Це посилання пояснює, що я кажу: посилання HP про inttypes.h
І це посилання має таблицю, яка показує, чому ви не хочете використовувати long
або int
якщо у вас є намір певна кількість бітів бути присутнім у вашому типі даних.
Посилання IBM про портативні типи даних
stdint.h - очевидний вибір, але він не обов'язково доступний.
Якщо ви використовуєте портативну бібліотеку, можливо, вона вже надає портативні цілі числа фіксованої ширини. Наприклад, SDL має Sint32
(S означає "підписано"), а GLib має gint32
.
Використовуйте <stdint.h>
.
Якщо ваша реалізація підтримує доповнення 32-розрядних цілих чисел 2, тоді вона повинна визначити int32_t
.
Якщо ні, то наступне найкраще - це int_least32_t
- це цілочисельний тип, що підтримується реалізацією, принаймні 32 біти, незалежно від представлення (доповнення двох, доповнення одного тощо).
Існує також int_fast32_t
цілочисельний тип шириною не менше 32 біт, обраний з метою дозволити найшвидші операції відповідно до цього розміру.
Ви можете використовувати long
, що гарантовано має принаймні 32-бітну ширину в результаті мінімальних вимог до діапазону, визначених стандартом.
Якщо ви віддаєте перевагу використанню найменшого цілочисельного типу для розміщення 32-розрядного числа, тоді ви можете використовувати оператори препроцесора, як показано нижче, з макросами, визначеними в <limits.h>
:
#define TARGET_MAX 2147483647L
#if SCHAR_MAX >= TARGET_MAX
typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
typedef short int32;
#elif INT_MAX >= TARGET_MAX
typedef int int32;
#else
typedef long int32;
#endif
#undef TARGET_MAX