2012-04-19 80 views
12

Tôi đang sử dụng Code::Blocks với GCC 4.4.1 và dường như tôi không thể in số nguyên được ký 64 bit từ mã C của tôi.Làm thế nào để in số nguyên 64 bit trong GCC 4.4.1?

Mã này:

long long longint; 

longint = 0x1BCDEFABCDEFCDEF; /* 2003520930423229935 */ 
printf("Sizeof: %d-bit\n", sizeof(longint) * 8);  /* Correct */ 
printf("%llx\n", longint);       /* Incorrect */ 
printf("%x%x\n", *(((int*)(&longint))+1), longint); /* Correct */ 
printf("%lld\n", longint);       /* Incorrect */ 

Tạo đầu ra:

Sizeof: 64-bit 
cdefcdef 
1bcdefabcdefcdef 
-839922193 

64-bit số học dường như làm việc một cách chính xác:

longint -= 0x1000000000000000; 
printf("%x%x\n", *(((int*)(&longint))+1), longint); 

Cung cấp:

bcdefabcdefcdef 

Tôi có thiếu gì đó không?

+1

có thể trùng lặp của [câu hỏi này] (http://stackoverflow.com/questions/2844/how-do-you-printf-an-unsigned-long- dài-int). – npclaudiu

+0

Printf thứ hai không chính xác như thế nào? Ah, tôi thấy trong ví dụ bây giờ. Đừng bận tâm. Ví dụ in ra giá trị phù hợp với tôi trên Linux. –

+0

@npclaudiu - Cảm ơn. Tôi đã nhận nó từ đó! – Fenikso

Trả lời

6

Xem liệu %I64d có giúp ích cho bạn hay không. %lld là tốt cho long long int nhưng mọi thứ trở nên thực sự khác nhau đôi khi trên Windows IDE

9

Để (trong C99 trở lên) portably in số nguyên 64 bit, bạn nên #include <inttypes.h> và sử dụng các macro C99 PRIx64PRId64. Điều đó sẽ làm cho mã của bạn;

printf("Sizeof: %d-bit\n", sizeof(longint) * 8); 
printf("%" PRIx64 "\n", longint); 
printf("%" PRId64 "\n", longint); 

Chỉnh sửa: Xem this question để biết thêm ví dụ.

+2

Đó là các định dạng kỹ thuật cho 'int64_t', trong trường hợp xảy ra khác với' long long'. Tất nhiên có một số cơ hội mà họ thực sự * làm việc * trên hiện tại bị hỏng/không-khá-C99-vẫn còn hệ thống. :-) – torek

+0

Cũng hoạt động. Cảm ơn! – Fenikso

0

Cuối cùng đã nhận nó:

longint = 0x1BCDEFABCDEFCDEF; /* 2003520930423229935 */ 
printf("%I64d\n", longint); 
printf("%I64x\n", longint); 

Prints:

2003520930423229935 
1bcdefabcdefcdef 

Cảm ơn @npclaudiu!

4

Đây là hệ điều hành phụ thuộc. Nếu bạn đang làm điều này trên chỉ là về bất kỳ GCC sử dụng GLIBC, sau đó% llx hoạt động.

Tuy nhiên nếu bạn đang sử dụng trình biên dịch mingw, thì điều này sử dụng thư viện Microsoft và bạn cần xem xét documentation của chúng.

này thay đổi chương trình của bạn để:

longint = 0x1BCDEFABCDEFCDEFLL; /* 2003520930423229935 */ 
printf("Sizeof: %d-bit\n", sizeof(longint) * 8);  /* Correct */ 
printf("%I64x\n", longint);       /* Incorrect */ 
printf("%x%x\n", *(((int*)(&longint))+1), longint); /* Correct */ 
printf("%I64d\n", longint); 
+1

+1 để chỉ ra các tài liệu mingw cho Windows. – Fenikso

Các vấn đề liên quan