如何打印uint32_t和uint16_t变量值?

时间:2012-08-25 08:28:36

标签: 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;
}

我也用过

 printf("%"PRIu32, a);

显示错误。

如何打印这些值以及所需的输出是什么?

2 个答案:

答案 0 :(得分:62)

如果您想要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;
}

输出:

1234
5678

答案 1 :(得分:14)

<inttypes.h>中定义的宏是打印uint32_tuint16_t等类型值的最正确方法 - 但它们不是唯一的方法。

就个人而言,我发现这些宏很难记住并且难以使用。 (鉴于printf格式字符串的语法,这可能是不可避免的;我没有声称我可以想出一个更好的系统。)

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

类型intunsigned int由语言保证至少为16位宽,因此能够保存int16_t或{{1}类型的任何转换值}, 分别。同样,uint16_tlong的宽度至少为32位,unsigned longlong long的宽度至少为64位。

例如,我可能会像这样编写你的程序(还有一些额外的调整):

unsigned long long

这种方法的一个优点是它甚至可以在不支持#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; } 的C99之前的实现中工作。这样的实现很可能也没有<inttypes.h>,但该技术对其他整数类型很有用。