中定义的宏<inttypes.h>
是打印类型值的最正确方法uint32_t
,uint16_t
等等——但它们不是唯一的方法。
就个人而言,我发现这些宏很难记住并且使用起来很尴尬。(考虑到printf
格式字符串的语法,这可能是不可避免的;我并不是说我可以想出一个更好的系统。)
另一种方法是将值转换为预定义类型并使用该类型的格式。
语言保证类型int
和unsigned int
至少为 16 位宽,因此能够分别保存任何类型int16_t
或的转换值uint16_t
。同样,long
和unsigned long
至少 32 位宽, 和long long
至少unsigned long long
64 位宽。
例如,我可能会这样编写你的程序(加上一些额外的调整):
#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;
}
这种方法的一个优点是它甚至可以与不支持<inttypes.h>
. 这样的实现很可能两者都没有<stdint.h>
,但该技术对其他整数类型很有用。