为什么 int 在 printf 函数中被格式化为 %#X?

Why would an int be formatted as %#X in a printf function?

我正在调试一些代码(不是我自己写的)并且在 printf 函数中用 %#X 打印了一个 int index。根据我的理解 %#X 是一个大写 无符号 十六进制整数。

这个ok/is有什么办法解决这个问题吗?

# 结合 X 格式将在以大写十六进制格式打印 index 值之前打印 0X
它看起来完全没问题,没有进一步的解释,我们无法给你一个“绕过这个的方法”。

# 转换说明符指示应使用 替代 转换。

来自cppreference

In the alternative implementation 0x or 0X is prefixed to results if the converted value is nonzero.

所以,这似乎是作者故意的。

如果您问的是 unsigned 部分,%X always unsigned。如果你有一个带符号的值,并且你希望你的十六进制值以负号为前缀,你将不得不自己滚动。

否则,将有符号值作为输入就很好了——它只会被重新解释为无符号值。除非这是您在程序中发现的错误! ;)

From my understanding %#X is an uppercase unsigned hexadecimal integer.

这是正确的,根据 C 标准,对应于 %#X 的参数应该是一个 unsigned int,并且传递 int 的行为在技术上不是由C 标准,根据 C 2018 7.21.6.1 8(表示 X 用于 unsigned int)和 9(“如果任何参数不是相应转换规范的正确类型,则行为未定义。” )

实际上,很少(如果有的话)C 实现会抱怨这一点,或者除了实际上将 int 的位重新解释为 unsigned int.

之外的其他行为。

Is this ok/is there any way around this?

为了使代码迂腐地正确,将参数转换为 unsigned int