Makra zdefiniowane w <inttypes.h>
są najbardziej poprawny sposób aby wydrukować wartości typów uint32_t
, uint16_t
, i tak dalej - - ale nie są one jedyną drogą.
Osobiście uważam te makra za trudne do zapamiętania i niewygodne w użyciu. (Biorąc pod uwagę składnię ciągu formatu printf
, prawdopodobnie jest to nieuniknione, nie twierdzę, że mogłem wymyślić lepszy system.)
Alternatywą jest rzutowanie wartości na predefiniowany typ i użycie formatu dla ten typ.
Rodzaje int
i unsigned int
gwarantuje języka na co najmniej długość 16 bitów, a więc w stanie utrzymać każdą przekonwertowany wartość typu int16_t
lub uint16_t
, odpowiednio. Podobnie, long
i unsigned long
mają szerokość co najmniej 32 bity, a long long
i unsigned long long
mają szerokość co najmniej 64 bitów.
Na przykład, mogę napisać swój program tak (z kilkoma dodatkowymi szczypie):
#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;
}
Zaletą tego podejścia jest to, że może pracować nawet z pre-C99 wdrożeń, które nie obsługują <inttypes.h>
. Taka implementacja najprawdopodobniej nie miałaby również wartości <stdint.h>
, ale technika ta jest użyteczna w przypadku innych typów liczb całkowitych.
O wiele lepiej byłoby pokazać nam (dokładny!) Komunikat o błędzie, niż po prostu powiedzieć, że "pokazuje błąd". I zamiast "nie dawać pożądanego o/p", pokaż nam rzeczywiste wyniki (i przeliteruj słowo "wyjście", zamiast pisać "o/p"). –