如何在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&lt;0) printf("-")。因为您的代码中有两个可能的错误。 @Lundin:这不是混淆。考虑格式字符串更长并且涉及要打印为带符号的 4 个十六进制值的情况。您想要一个包含 16 个 printf 语句的 if/else 树,还是一个处理整个事情的 printf 语句? @Lundin:您的第二条和第三条评论只是大错特错'-' 在 C 中以 int 开头,而不是 char。并且不可能将类型 char 传递给可变参数函数。 %c 需要 int 类型的参数。至于第三条评论,一元 - 运算符当然对有符号值有意义。而signednegative 的意思不一样。它意味着(大致)具有积极或消极的特征。在这一点上,我认为您应该停止评论并为自己找到一本关于 C 语言的好书... (1) 这是 C,不是 C++。它们是完全不同的语言。 (2) 即使在 C++ 中,可变参数函数也会受到默认提升。将char 传递给printf 总是不可能的。至于否定的问题,您声称 (x&lt;0)?-x:x,“如果 x 已签名,则代码使用一元 - 运算符没有意义,因为 x 已经是所需的格式。”。我不确定您所说的“格式”是什么意思,但 x 没有所需的 ,这在这里很重要。此外,(x&lt;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 中计算为 01"+-"[x &lt; 0 ? 1 : 0] 将是多余的。请注意,此表达式也可以写成更模糊的样式:(x &lt; 0)["+-"]

以上是关于如何在C中打印带符号的十六进制的主要内容,如果未能解决你的问题,请参考以下文章

将带符号的 Int 转换为带空格的十六进制字符串

十六进制字符串到 Python 3.2 中的带符号整数?

Shell常用命令之printf

编写程序求出首地址为DAT的十六个带符号字数据中的最大奇数,并将这个数存到DAT1单元中 用汇编

用python从二进制文件中读取32位带符号的ieee 754浮点?

练习5:更多变量和打印