53

我正在尝试打印 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);

显示错误。

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

4

2 回答 2

76

如果您想要类型及其兄弟inttypes.h的所有那些漂亮的新格式说明符,则需要包括在内,这正确的(即可移植的)方法,前提是您的编译器符合 C99。如果尺寸与您的想法不同,则不应使用标准尺寸。intN_t%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
于 2012-08-25T08:40:58.477 回答
16

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

就个人而言,我发现这些宏很难记住并且使用起来很尴尬。(考虑到printf格式字符串的语法,这可能是不可避免的;我并不是说我可以想出一个更好的系统。)

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

语言保证类型intunsigned int至少为 16 位宽,因此能够分别保存任何类型int16_t或的转换值uint16_t。同样,longunsigned long至少 32 位宽, 和long long至少unsigned long long64 位宽。

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

#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>,但该技术对其他整数类型很有用。

于 2014-09-23T00:17:59.900 回答