Представление 64-битного целого числа в GNU / Linux - PullRequest
12 голосов
/ 04 декабря 2011

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

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

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

Ответы [ 4 ]

25 голосов
/ 04 декабря 2011

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

8 голосов
/ 04 декабря 2011

Вам нужно ровно 64 бита или хотя бы 64 бита?

Используйте любой из int64_t, int_least64_t или int_fast64_t, наиболее четко выражающий ваши намерения. (Все три почти наверняка относятся к одному типу в современных системах, но документирование ваших намерений является ценным.)

Все реализации должны обеспечивать int_least64_t и int_fast64_t. По крайней мере теоретически возможно, что int64_t может не существовать (скажем, если компилятор имеет 128-битный тип, но не 64-битный тип, или если целые числа со знаком не представлены с использованием дополнения 2).

(Но в каждой из реализаций C99, которые я когда-либо видел, long long - это ровно 64 бита, а int64_t существует.)

8 голосов
/ 04 декабря 2011

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

0 голосов
/ 04 декабря 2011

Определите пользовательский тип для 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;
...