繁体   English   中英

如何打印 uint32_t 和 uint16_t 变量的值?

[英]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_tuint16_t等类型值的最正确方法——但它们不是唯一的方法。

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

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

语言保证intunsigned int类型至少为 16 位宽,因此能够分别保存int16_tuint16_t类型的任何转换值。 类似地, longunsigned long至少为 32 位宽, long longunsigned 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM