【问题标题】:How do I print uint32_t and uint16_t variables' value?如何打印 uint32_t 和 uint16_t 变量的值?
【发布时间】:2012-08-20 16:03:00
【问题描述】:

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

显示错误。

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

【问题讨论】:

  • 向我们展示(确切的!)错误消息会比仅仅说它“显示错误”更有帮助。而不仅仅是“没有给出想要的 o/p”,而是向我们展示实际的输出(并拼出“输出”这个词而不是写“o/p”)。
  • printf("%d---------%d",a1); 会产生未定义的行为,因为格式字符串中有两个 %d 但只传递一个参数。

标签: c gcc


【解决方案1】:

如果你想要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

【讨论】:

    【解决方案2】:

    &lt;inttypes.h&gt; 中定义的宏是打印 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;
    }
    

    这种方法的一个优点是,它甚至可以用于不支持&lt;inttypes.h&gt; 的 C99 之前的实现。这样的实现很可能也没有&lt;stdint.h&gt;,但该技术对其他整数类型很有用。

    【讨论】:

    • 这里有一个非常小的边缘情况,如果有符号的 int 不是二进制补码。在这种情况下,它不会正确地保存最负的二进制补码值。非常小,我承认,但如果你想要最大的便携性,需要注意一些事情。
    • @paxdiablo:intN_t 类型必须是二进制补码,没有填充位。如果int 不是二进制补码,则可能不会定义intN_t 类型除非实现也支持不同的二进制补码类型。好点,但我认为这是一个比你建议的更小的边缘情况。
    • 毫无疑问。我怀疑你很难在这个星球上找到一台运行新整数类型但仍然有一个补码或符号/大小int类型的机器:-)
    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2020-07-26
    • 2023-04-09
    • 2022-12-13
    • 1970-01-01
    相关资源
    最近更新 更多