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

问题描述 投票:0回答:3

我正在调试一些代码(不是我自己编写的),并且在 printf 函数中用

index
打印了一个 int
%#X
。根据我的理解,
%#X
是一个大写的无符号十六进制整数。

这样可以吗/有什么办法可以解决这个问题吗?

c printf format-specifiers
3个回答
2
投票

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

来自cppreference

在替代实现中

0x
0X
是结果的前缀,如果 转换后的值非零。

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

如果您问的是其中的 unsigned 部分,则

%X
always 无符号。如果您有一个带符号的值,并且希望您的十六进制值以负号为前缀,则您必须自己滚动。

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


1
投票

根据我的理解 %#X 是一个大写无符号十六进制整数。

这是正确的,根据 C 标准,与

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

实际上,很少有(如果有的话)C 实现会抱怨这一点或表现出除了实际上将

int
的位重新解释为
unsigned int
之外的行为。

这样可以吗/有什么办法可以解决这个问题吗?

为了使代码迂腐正确,请将参数转换为

unsigned int


0
投票

#
X
格式相结合,将先打印
0X
,然后再以大写十六进制格式打印
index
值。
看起来完全没问题,如果没有进一步的解释,我们无法给您“解决这个问题的方法”。

© www.soinside.com 2019 - 2024. All rights reserved.