Ответ 1
int64_t
- Это потому, что это самое портативное представление. Остальные два могут быть представлены по-разному на других машинах.
Я использую Ubuntu 10.10 (64 бит) с gcc
, и я хотел использовать 64-битное целое в моей программе на С++.
В моей системе выходы sizeof(long)
, sizeof(long long int)
и sizeof(int64_t)
- все 8 байтов (64 бит).
Какой квалификатор (long
, long long
или int64_t
) вы бы рекомендовали использовать 64-битные целые числа?
int64_t
- Это потому, что это самое портативное представление. Остальные два могут быть представлены по-разному на других машинах.
int64_t. Если вам нужно 64 бита, объявите его явно. Размер длинной и длинной длинной зависит от машины.
Вам нужно ровно 64 бита или не менее 64 бит?
Используйте то, что из int64_t
, int_least64_t
или int_fast64_t
наиболее четко выражает ваши намерения. (Все три почти наверняка будут одного и того же типа в существующих системах, но документирование ваших намерений ценно.)
Все реализации должны обеспечивать int_least64_t
и int_fast64_t
. По крайней мере теоретически возможно, что int64_t
может не существовать (скажем, если компилятор имеет тип 128-битного типа, но не 64-разрядный, или целые числа со знаком не представлены с использованием 2'-дополнения).
(Но в каждой реализации C99-ish, которую я когда-либо видел, long long
составляет ровно 64 бита, а int64_t
существует.)
Определите настраиваемый тип для 64-битного целого и используйте его в своем коде. Используйте директиву #ifdef, чтобы компилятор мог выбрать правильный. Пример объединения целых чисел:
#ifdef (_MSC_VER)
#include <basetsd.h>
#define int8_t INT8
#define uint8_t UINT8
#define int16_t INT16
#define uint16_t UINT16
#define int32_t INT32
#define uint32_t UINT32
#define int64_t INT64
#define uint64_t UINT64
#else
#include <inttypes.h>
#endif
typedef uint8_t u8_t;
typedef int8_t s8_t;
typedef uint16_t u16_t;
typedef int16_t s16_t;
typedef uint32_t u32_t;
typedef int32_t s32_t;
typedef uint64_t u64_t;
typedef int64_t s64_t;