我正在尝试打印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;
}
Run Code Online (Sandbox Code Playgroud)
我也用过
printf("%"PRIu32, a);
Run Code Online (Sandbox Code Playgroud)
这显示错误.
如何打印这些值以及所需的输出?
pax*_*blo 64
inttypes.h如果你想要这些intN_t类型及其兄弟的所有那些漂亮的新格式说明符,你需要包括,并且这是正确的(即,可移植的)方法,只要您的编译器符合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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1234
5678
Run Code Online (Sandbox Code Playgroud)
Kei*_*son 14
中定义的宏<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;
}
Run Code Online (Sandbox Code Playgroud)
这种方法的一个优点是它甚至可以在不支持的C99之前的实现中工作<inttypes.h>.这种实现很可能也没有<stdint.h>,但该技术对其他整数类型很有用.