Các macro được định nghĩa trong <inttypes.h>
là cách chính xác nhất để in các giá trị của các loại uint32_t
, uint16_t
, và vân vân - - nhưng chúng không phải là cách duy nhất.
Cá nhân, tôi thấy những macro này khó nhớ và khó xử khi sử dụng. (Với cú pháp của một chuỗi định dạng printf
, điều đó có thể là không thể tránh khỏi; Tôi không tuyên bố rằng tôi có thể đưa ra một hệ thống tốt hơn.)
Một cách khác là đưa giá trị vào một loại được xác định trước và sử dụng định dạng cho loại đó.
loại int
và unsigned int
được đảm bảo bởi các ngôn ngữ có ít nhất 16 bit rộng, và do đó để có thể giữ bất kỳ giá trị chuyển đổi của loại int16_t
hoặc uint16_t
, tương ứng. Tương tự, long
và unsigned long
có chiều rộng tối thiểu 32 bit và long long
và unsigned long long
rộng ít nhất 64 bit.
Ví dụ, tôi có thể viết chương trình của bạn như thế này (với một vài tinh chỉnh bổ sung):
#include <stdio.h>
#include <stdint.h>
#include <netinet/in.h>
int main(void)
{
uint32_t a=12, a1;
uint16_t b=1, b1;
a1 = htonl(a);
printf("%lu---------%lu\n", (unsigned long)a, (unsigned long)a1);
b1 = htons(b);
printf("%u-----%u\n", (unsigned)b, (unsigned)b1);
return 0;
}
Một ưu điểm của phương pháp này là nó có thể làm việc ngay cả với hiện thực-C99 trước không hỗ trợ <inttypes.h>
. Việc triển khai như vậy rất có thể sẽ không có cả <stdint.h>
, nhưng kỹ thuật này hữu ích cho các loại số nguyên khác.
Nguồn
2014-09-23 00:17:59
Sẽ hữu ích hơn nếu hiển thị thông báo lỗi (chính xác!) Thay vì chỉ nói rằng đó là "hiển thị lỗi". Và thay vì chỉ "không đưa ra mong muốn o/p", cho chúng ta thấy đầu ra thực tế (và đánh vần từ "đầu ra" thay vì viết "o/p"). –