如何在C中打印带符号的十六进制
Posted
技术标签:
【中文标题】如何在C中打印带符号的十六进制【英文标题】:How to print signed hexadecimal in C 【发布时间】:2012-03-25 01:39:35 【问题描述】:我知道我们可以使用printf("%04X", value);
打印无符号十六进制值。
C 中是否有类似的标志或函数可用于打印带符号的十六进制值?
类似的东西
Binary Hex (signed) Hex (unsigned)
-------- ----------- --------------
00000010 +0x2 0x2
00000001 +0x1 0x1
00000000 +0x0 0x0
11111111 -0x1 0xFF
11111110 -0x2 0xFE
11111101 -0x3 0xFD
【问题讨论】:
【参考方案1】:“有符号”十六进制值是什么意思?你想要像“-e0
”这样的东西吗?如果是这样,那意味着什么?该符号已经以十六进制显示,因为它显示了所有位,这就是数字中的所有信息。
【讨论】:
嗯,它可以解释为十六进制的值,前面有符号。是否出于正当理由想要它是另一个问题:)【参考方案2】:不,但你可以做类似的事情
printf("%c%04X", (x<0) ? '-' : ' ', (x<0) ?-x : x);
但是,正如其他人指出的那样,是否有正当理由这样做是值得怀疑的。根据您的帖子,您确实了解您的要求,所以都是您的错;-)
【讨论】:
如果您不喜欢错误和混淆,您可以在打印数字之前简单地执行if(x<0) printf("-")
。因为您的代码中有两个可能的错误。
@Lundin:这不是混淆。考虑格式字符串更长并且涉及要打印为带符号的 4 个十六进制值的情况。您想要一个包含 16 个 printf
语句的 if/else 树,还是一个处理整个事情的 printf
语句?
@Lundin:您的第二条和第三条评论只是大错特错。 '-'
在 C 中以 int
开头,而不是 char
。并且不可能将类型 char
传递给可变参数函数。 %c
需要 int
类型的参数。至于第三条评论,一元 -
运算符当然对有符号值有意义。而signed 和negative 的意思不一样。它意味着(大致)具有积极或消极的特征。在这一点上,我认为您应该停止评论并为自己找到一本关于 C 语言的好书...
(1) 这是 C,不是 C++。它们是完全不同的语言。 (2) 即使在 C++ 中,可变参数函数也会受到默认提升。将char
传递给printf
总是不可能的。至于否定的问题,您声称 (x<0)?-x:x
,“如果 x 已签名,则代码使用一元 - 运算符没有意义,因为 x 已经是所需的格式。”。我不确定您所说的“格式”是什么意思,但 x
没有所需的 值,这在这里很重要。此外,(x<0)?-x:x
始终具有相同的签名(无符号vs签名)简单地x
。
@MichaelKrelin-hacker 如果额外的函数调用对您的性能至关重要,那么您首先不应该使用 stdio.h。【参考方案3】:
不幸的是,C 的printf
函数无法直接执行此操作。您当然可以尝试:
printf("%s%x\n", x<0 ? "-" : "", x<0 ? -(unsigned)x : x);
这也适用于处理 INT_MIN。
【讨论】:
wuahhh,现在这是一个丑陋的黑客......难道没有其他的东西,甚至在 C99 中也没有?如果不是:该死的,C。【参考方案4】:这是一个更简单的版本:
#include <stdio.h>
#include <stdib.h>
...
printf("%c%#x\n", "+-"[x < 0], (unsigned)abs(x));
【讨论】:
这是一个有趣的解决方案。我从未见过像“+-”[ x @AshleyDuncan:你可以指望它!比较运算符被定义为在 C 中计算为0
或 1
。"+-"[x < 0 ? 1 : 0]
将是多余的。请注意,此表达式也可以写成更模糊的样式:(x < 0)["+-"]
。以上是关于如何在C中打印带符号的十六进制的主要内容,如果未能解决你的问题,请参考以下文章
编写程序求出首地址为DAT的十六个带符号字数据中的最大奇数,并将这个数存到DAT1单元中 用汇编