【发布时间】:2021-07-28 00:59:33
【问题描述】:
例如
printf("%x",16);
此 printf 打印 10 而不是 16 为什么它不将值作为十六进制请有人解释一下
【问题讨论】:
-
十进制的 16 是十六进制的 10。
标签: c hex printf conversion-specifier
例如
printf("%x",16);
此 printf 打印 10 而不是 16 为什么它不将值作为十六进制请有人解释一下
【问题讨论】:
标签: c hex printf conversion-specifier
16 是一个十进制整数常量。因此常数的十六进制表示是10。如果你想指定一个十六进制整数常量,那么写0x16u。请注意,转换说明符x 需要unsigned int 类型的参数。所以后缀u用在十六进制整数常量中。
所以printf 的调用看起来像
printf( "%x\n", 0x16u );
输出将是16。
或者
printf( "%#x\n", 0x16u );
输出将是0x16。
【讨论】:
当您将数字传递给函数时,您传递的不是十进制或十六进制。从概念上讲,您传递的是一个值,一个抽象的数学数字。
该数字以某种类型表示,而 C 使用二进制来表示整数类型的值(以及一些二进制的补充用于有符号数,通常是二进制补码)。
无论您编写printf("%x\n", 16u) 还是printf("%x\n", 0x10u);,编译器都会将该源代码中的数字16u 或0x10u 转换为unsigned int 值,以二进制表示。传递给printf 的是结果值,而不是十进制“16”或十六进制“10”。
(我使用16u 和0x10u 而不是16 或0x10,因为printf 需要unsigned int,而不是int。)
%x 指令告诉printf 期待unsigned int 值并将其转换 为十六进制数字。所以原来的输入形式是无关紧要的; %x 表示不管原始形式如何都产生十六进制。
【讨论】: