【问题标题】:C: Correct way to print "unsigned long" in hexC:以十六进制打印“unsigned long”的正确方法
【发布时间】:2015-06-13 02:30:13
【问题描述】:

我有一个函数,它获取一个 unsigned long 变量作为参数,我想用十六进制打印它。

正确的做法是什么?

目前,我使用 printf"%lx"

void printAddress(unsigned long address) {
    printf("%lx\n", address);
}

我应该寻找 unsigned 长十六进制的 printf 模式吗? (而不仅仅是上面提到的“长十六进制”)

或者 printf 是否仅使用位将数字转换为十六进制? - 所以我不应该关心这个标志吗?

编辑/澄清

这个问题源于一个混淆:十六进制只是表达的另一种方式,这意味着有符号/无符号数只是一种解释。因此,类型为 unsigned 长这一事实不会更改十六进制数字。无符号只是告诉你如何在你的计算机程序中解释这些相同的位。

【问题讨论】:

  • 请查阅友好文档。
  • %lx 遇到什么问题?这对于 unsigned long 应该没问题。当然,如果您的address 参数确实是一个地址,那么您可能应该将它作为void * 传递并使用%p 打印它。
  • printf 缺少的是一种打印有符号的十六进制数字...的方法
  • 实际上我现在看到在 cplusplus.com 中非常大胆地写着“x”是无符号十六进制。你是对的,我的问题不是很有用......
  • @SomethingSomething:正如接受的答案所表明的那样,它实际上是微不足道的,即手册包含对您问题的直接答案。在 Stack Overflow 上发帖并没有增加任何内容。

标签: c printf


【解决方案1】:

你做得对。

来自the manual page

o, u, x, X

unsigned int 参数被转换为无符号八进制 (o)、无符号十进制 (u) 或无符号十六进制(x 和 X)表示法。

因此x 的值应始终为unsigned。要使其大小为long,请使用:

l

(ell) 后面的整数转换对应一个 long int 或 unsigned long int 参数 [...]

所以%lxunsigned long。但是,地址(指针值)应使用%p 打印并转换为void *

【讨论】:

  • 所以实际上结论是“%lx”无论如何都是未签名的。谢谢!
  • "So %lx is unsigned long" 听起来格式说明符是unsigned long。更好地表述为 "%lx" 应该使用 with unsigned long
【解决方案2】:

我认为以下格式说明符应该可以工作 试试看

printf("%#lx\n",address);

【讨论】:

  • 关闭,但没有雪茄!使用printf("0x%lx\n",address);printf("%#lx\n",address);,但不能同时使用。第一个将值0UL 打印为0x0,而第二个将仅输出0。这个建议会教给 OP 一些东西,但与问题无关。
猜你喜欢
  • 2012-09-11
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2015-02-14
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多