[英]How do I print uint32_t and uint16_t variables' value?
我正在尝试打印 uint16_t 和 uint32_t 值,但它没有提供所需的输出。
#include <stdio.h>
#include <netinet/in.h>
int main()
{
uint32_t a = 12, a1;
uint16_t b = 1, b1;
a1 = htonl(a);
printf("%d---------%d", a1);
b1 = htons(b);
printf("\n%d-----%d", b, b1);
return 0;
}
我也用过
printf("%"PRIu32, a);
这是显示错误。
如何打印这些值以及所需的输出是什么?
如果您想要intN_t
类型及其兄弟的所有那些漂亮的新格式说明符,您需要包含inttypes.h
,并且这是正确的(即,可移植的)方法,前提是您的编译器符合 C99。 你不应该使用标准的%d
或%u
以防大小与你的想法不同。
它包括stdint.h
并扩展了很多其他东西,例如可用于printf/scanf
系列调用的宏。 这在 ISO C99 标准的第 7.8 节中有介绍。
例如,以下程序:
#include <stdio.h>
#include <inttypes.h>
int main (void) {
uint32_t a=1234;
uint16_t b=5678;
printf("%" PRIu32 "\n",a);
printf("%" PRIu16 "\n",b);
return 0;
}
输出:
1234
5678
<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>
的 C99 之前的实现一起工作。 这样的实现很可能也没有<stdint.h>
,但该技术对其他整数类型很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.