打印多个字符,格式为整数

时间:2018-07-02 09:13:30

标签: c gcc

每当我运行此程序时,它就会输出 12592 。 我找不到背后的逻辑。它在C编程中。

#include <stdio.h>

int main()
{

    printf("%d",'10');

    return 0;
}

3 个答案:

答案 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。