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

Представление 64-битного целого в GNU/Linux

Я использую Ubuntu 10.10 (64 бит) с gcc, и я хотел использовать 64-битное целое в моей программе на С++.

В моей системе выходы sizeof(long), sizeof(long long int) и sizeof(int64_t) - все 8 байтов (64 бит).

Какой квалификатор (long, long long или int64_t) вы бы рекомендовали использовать 64-битные целые числа?

4b9b3361

Ответ 1

int64_t - Это потому, что это самое портативное представление. Остальные два могут быть представлены по-разному на других машинах.

Ответ 2

int64_t. Если вам нужно 64 бита, объявите его явно. Размер длинной и длинной длинной зависит от машины.

Ответ 3

Вам нужно ровно 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 существует.)

Ответ 4

Определите настраиваемый тип для 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;