2011-12-04 11 views
12

Używam Ubuntu 10.10 (64-bitowy) z gcc i chciałem użyć 64-bitowej liczby całkowitej w moim programie C++.Reprezentowanie 64-bitowej liczby całkowitej w GNU/Linux

W moim systemie wyjścia sizeof(long), sizeof(long long int) i sizeof(int64_t) są wszystkie 8 bajtów (64 bity). Które kwalifikowanie (long, long long lub int64_t) zaleciłoby użycie liczb całkowitych 64-bitowych?

Odpowiedz

25

int64_t - Jest tak, ponieważ jest to najbardziej przenośna reprezentacja. Pozostałe dwa mogą być reprezentowane inaczej na innych maszynach.

+0

+1. Rozważmy Win64 LLP64 i Unix LP64: http://en.wikipedia.org/wiki/64-bit#64-bit_data_models –

8

int64_t. Jeśli potrzebujesz 64 bitów, zadeklaruj to wyraźnie. Wielkość długiej i długiej długości zależy od maszyny.

8

Potrzebujesz dokładnie 64 bitów lub co najmniej 64 bitów?

Użyj tego, co z int64_t, int_least64_t lub int_fast64_t najbardziej wyraźnie wyraża twój zamiar. (Wszystkie trzy są prawie pewne, że są tego samego typu na obecnych systemach, ale udokumentowanie twoich zamiarów jest cenne.)

Wszystkie wdrożenia muszą zapewniać int_least64_t i int_fast64_t. Teoretycznie możliwe jest, że int64_t może nie istnieć (np. Jeśli kompilator ma typ 128-bitowy, ale nie ma typu 64-bitowego, lub jeśli liczby całkowite ze znakiem nie są reprezentowane za pomocą uzupełnienia 2-s).

(ale w każdym C99-owski realizacji jaki kiedykolwiek widziałem, long long jest dokładnie 64 bitów, a int64_t istnieje.)

+1

+1 dla przypomnienia o najmniejszych i szybkich aliasach typu. –

0

Zdefiniuj niestandardowy typ dla 64-bitowej liczby całkowitej i używać go w kodzie. Użyj dyrektywy #ifdef, aby kompilator mógł wybrać właściwą. Przykład ujednolicenia niektórych liczb całkowitych:

#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; 
Powiązane problemy