当我要使用 printf 打印十六进制值时,它为什么将输入作为十进制值?

问题描述

例如

printf("%x",16);

这个 printf 打印 10 而不是 16 为什么它不把值作为十六进制请有人解释一下

解决方法

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);,编译器都会将源代码中的数字 16u0x10u 转换为 unsigned int 值,表示为二进制。传递给 printf 的是结果值,而不是十进制“16”或十六进制“10”。

(我使用 16u0x10u 而不是 160x10 因为 printf 需要 unsigned int,而不是 {{1} }.)

int 指令告诉 %x 期待一个 printf 值并将其转换为十六进制数字。所以原来的输入形式是无关紧要的; unsigned int 表示无论原始形式如何都生成十六进制。