2011-12-04 38 views
12

Tôi đang sử dụng Ubuntu 10.10 (64 bit) với gcc và tôi muốn sử dụng số nguyên 64 bit trong chương trình C++ của mình.Trình bày một số nguyên 64 bit trong GNU/Linux

Trên hệ thống của tôi, đầu ra của sizeof(long), sizeof(long long int)sizeof(int64_t) là tất cả 8 byte (64 bit).

Vòng loại nào (long, long long hoặc int64_t) bạn có khuyên bạn nên sử dụng số nguyên 64 bit không?

Trả lời

25

int64_t - Điều này là do đây là đại diện di động nhất. Hai loại kia có thể được biểu diễn khác nhau trên các máy khác.

+0

+1. Xem xét Win64 LLP64 và Unix LP64: http://en.wikipedia.org/wiki/64-bit#64-bit_data_models –

8

int64_t. Nếu bạn cần 64 bit, hãy khai báo rõ ràng. Kích thước dài và dài thay đổi theo máy.

8

Bạn có cần chính xác 64 bit hoặc ít nhất 64 bit không?

Sử dụng tùy chọn nào trong số int64_t, int_least64_t hoặc int_fast64_t rõ ràng nhất thể hiện ý định của bạn. (Tất cả ba là gần như chắc chắn là cùng loại trên hệ thống hiện tại, nhưng tài liệu ý định của bạn là có giá trị.)

Mọi triển khai phải cung cấp int_least64_tint_fast64_t. Ít nhất về lý thuyết có thể là int64_t có thể không tồn tại (giả sử, nếu trình biên dịch có loại 128 bit nhưng không có kiểu 64 bit, hoặc nếu các số nguyên đã ký không được biểu diễn bằng cách sử dụng phần bổ sung 2).

(Nhưng trong mỗi thực hiện C99-ish mà tôi từng thấy, long long là chính xác 64 bit, và int64_t tồn tại.)

+1

+1 cho lời nhắc nhở về các bí danh loại ít nhất và nhanh nhất. –

0

Xác định kiểu tùy chỉnh cho 64-bit số nguyên và sử dụng nó trong mã của bạn. Sử dụng chỉ thị #ifdef để trình biên dịch có thể chọn đúng. Ví dụ về hợp nhất một số số nguyên:

#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; 
Các vấn đề liên quan