我正在调试一些代码(不是我自己编写的),并且在 printf 函数中用
index
打印了一个 int %#X
。根据我的理解,%#X
是一个大写的无符号十六进制整数。
这样可以吗/有什么办法可以解决这个问题吗?
#
转换说明符指示应使用 alternative 转换。
来自cppreference:
在替代实现中
或0x
是结果的前缀,如果 转换后的值非零。0X
所以,这似乎是作者故意的。
如果您问的是其中的 unsigned 部分,则
%X
是 always 无符号。如果您有一个带符号的值,并且希望您的十六进制值以负号为前缀,则您必须自己滚动。
否则,将有符号值作为输入是很好的——它只会被重新解释为无符号。除非这是您在程序中发现的错误! ;)
根据我的理解 %#X 是一个大写无符号十六进制整数。
这是正确的,根据 C 标准,与
%#X
对应的参数应该是 unsigned int
,并且传递 int
的行为在技术上不是由 C 标准定义的,根据 C 2018 7.21.6.1 8 (其中表示 X
代表 unsigned int
)和 9(“如果任何参数不是相应转换规范的正确类型,则行为未定义。”)
实际上,很少有(如果有的话)C 实现会抱怨这一点或表现出除了实际上将
int
的位重新解释为 unsigned int
之外的行为。
这样可以吗/有什么办法可以解决这个问题吗?
为了使代码迂腐正确,请将参数转换为
unsigned int
。
#
与 X
格式相结合,将先打印 0X
,然后再以大写十六进制格式打印 index
值。