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

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

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

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


person smilingbuddha    schedule 04.12.2011    source источник


Ответы (4)


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

person Anthony Blake    schedule 04.12.2011
comment
+1. Рассмотрим Win64 LLP64 и Unix LP64: en.wikipedia.org/wiki/64-bit #64-bit_data_models - person Brett Hale; 04.12.2011

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

person Lalaland    schedule 04.12.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 существует.)

person Keith Thompson    schedule 04.12.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;
person vpp    schedule 04.12.2011
comment
Никогда не помещайте это в свои заголовки. Вы причините столько боли своим пользователям - person sehe; 02.04.2018
comment
Этот заголовок может вызвать эту проблему: lik" title="имеет дело с переопределением кода int typesuint16 t int16 t и т. д., а не с повышением lik"> stackoverflow.com/questions/49614169/ - person Robert Andrzejuk; 02.04.2018