每当我运行此程序时,它就会输出 12592 。 我找不到背后的逻辑。它在C编程中。
#include <stdio.h>
int main()
{
printf("%d",'10');
return 0;
}
答案 0 :(得分:6)
'10'
实际上是一个多字符常量。
它的类型为int
,就像'1'
一样,但其实际值是定义的实现。
很可能它的值是'1' * 256 + '0'
,在您的平台上为12592,据我所知,它是使用ASCII 编码的。
答案 1 :(得分:2)
正如其他人所说,您使用的是多字符常量,他们的解释告诉您为什么要按要求获得结果。
如果打算打印整数文字值10(到目前为止尚未直接评论),请使用
printf("%d",10);
请注意,第二个参数上没有单引号。
为此,
printf("10");
OR
printf("%s","10");
(打印字符串文字)也可以。
答案 2 :(得分:0)
在C(和C ++)中,撇号'
用于形成字符常量。通常,撇号之间是一个单一字符,例如'A'
,或者表示一个单一字符的转义序列,例如'\n'
或'\001'
或{{1 }}。
出于历史原因,可以在撇号之间放置多个实际字符,例如'\x01'
,或者您询问的情况为'AB'
。这些称为多字符字符常量。
这是一个值得怀疑的事情。结果是定义的实现,这意味着它在不同的编译器下可能会做不同的事情(尽管文档应告诉您它做了什么)。 C和C ++之间可能也大不相同。
由于它的功能定义不明确,并且即使定义明确,它也没有什么用处,因此通常的建议是不要使用多字符常量。 (而且,如果您不使用它们,甚至不必知道它们的用途。)
在大多数C编译器中,执行此操作后得到的结果是在内存中“追加”两个字符的结果,即,通过将两个8位数字彼此相邻来创建16位数字。 (目前,我假设多字符字符常量中只有两个字符,尽管实际上可能更多)。举个例子来解释这个问题可能是最简单的:
'10'
在我的机器上打印
#include <stdio.h>
int main()
{
printf("%d (%02x) %d (%02x) -> %d (%02x)\n", 'A', 'A', 'B', 'B', 'AB', 'AB');
printf("%d (%02x) %d (%02x) -> %d (%02x)\n", '1', '1', '0', '0', '10', '10');
}
(但是,请注意,在我的机器上,我的编译器向我显示消息“警告:多字符常量”,强化了这样的观念,即多字符常量通常不是一个好主意。)
将第二个示例视为内存中的字节; “ 1”看起来像
65 (41) 66 (42) -> 16706 (4142)
49 (31) 48 (30) -> 12592 (3130)
+------+
+----------+
或| 0x31 |
| 00110001 |
+------+
“ 10”看起来像
+----------+
+------+------+
+----------+----------+
或| 0x31 | 0x30 |
| 00110001 | 00110000 |
+------+------+
这个数字12592是哪里来的?它是十六进制数字0x3130的十进制表示形式。换句话说,就是256×49 + 48。