【问题标题】:How do I printf() a uint16_t?我如何 printf() 一个 uint16_t?
【发布时间】:2015-05-20 16:41:26
【问题描述】:

我需要使用 printf() 来打印一个 uint16_t。这个 SO 答案 (How to print uint32_t and uint16_t variables value?) 说我需要使用 inttypes.h。

但是,我正在使用嵌入式系统,并且 inttypes.h 不可用。当 uint16_t 的格式说明符不可用时,如何打印 uint16_t?

【问题讨论】:

  • printf("%u\n", (uint16_t)something);
  • 计算出各种整数类型在您的系统上的宽度,并使用适当的说明符。
  • @user3528438:不,%u 需要 unsigned int,而不是 uint16_t。演员应该是unsigned int

标签: c format-specifiers uint16


【解决方案1】:

一个明显的方法是:

printf("%u\n", (unsigned int)x);

unsigned int 保证至少为 16 位,因此这不是有损转换。

【讨论】:

  • 确实,其他任何东西都会过度设计。
  • 如果你确定类型永远不会改变,这很好。 inttypes.h 的一大优势是,如果您更改数据类型但忘记更改格式字符串,编译器会警告您。有了上述情况,如果将 x 更改为 uint64_t,则不会打印高位。诚然,如此大的变化并不常见,但它会发生,例如当值是从序列号变为 UUID 的键时。当采取这样的捷径时,上下文很重要。
【解决方案2】:

short int 是最小的至少 16 位,因此将值转换为 unsigned short int 并使用 %hu 打印。

【讨论】:

    【解决方案3】:

    您应该使用 inttypes.h 的样式,但要自己定义符号。 例如:

    #define PRIu8 "hu"
    #define PRId8 "hd"
    #define PRIx8 "hx"
    #define PRIu16 "hu"
    #define PRId16 "hd"
    #define PRIx16 "hx"
    #define PRIu32 "u"
    #define PRId32 "d"
    #define PRIx32 "x"
    #define PRIu64 "llu" // or possibly "lu"
    #define PRId64 "lld" // or possibly "ld"
    #define PRIx64 "llx" // or possibly "lx"
    

    为您的机器找出它们并使用它们。看看 inttypes.h 中的其他内容并找出您需要的内容。

    这样,您的代码将更具可移植性。自 70 年代后期以来,我一直在从事嵌入式系统工作。相信我:便携性很重要。

    【讨论】:

    • 我想不出更好的答案!便携性确实经常被低估。
    猜你喜欢
    • 2018-12-20
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2013-01-18
    • 2020-09-01
    相关资源
    最近更新 更多