为什么 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
。
我正在调试一些代码(不是我自己写的)并且在 printf 函数中用 %#X
打印了一个 int index
。根据我的理解 %#X
是一个大写 无符号 十六进制整数。
这个ok/is有什么办法解决这个问题吗?
#
结合 X
格式将在以大写十六进制格式打印 index
值之前打印 0X
。
它看起来完全没问题,没有进一步的解释,我们无法给你一个“绕过这个的方法”。
#
转换说明符指示应使用 替代 转换。
来自cppreference:
In the alternative implementation
0x
or0X
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
。