Представяне на 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's-допълнение).

(Но във всяка C99-ish реализация, която някога съм виждал, 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
Този хедър може да причини този проблем: stackoverflow.com/questions/49614169/ - person Robert Andrzejuk; 02.04.2018