如何打印uint32_t和uint16_t变量值?

xrc*_*wrn 39 c gcc

我正在尝试打印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格式字符串的语法,这可能是不可避免的;我并没有声称我可以想出一个更好的系统.)

另一种方法是将值转换为预定义类型,并使用该类型的格式.

类型intunsigned int由语言保证至少为16个位宽,并且因此能够保持类型的任何转换值int16_tuint16_t分别.类似地,longunsigned 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>,但该技术对其他整数类型很有用.