为什么它给我49的输出?

时间:2017-02-18 06:04:00

标签: c

#include <stdio.h>

int main(void)
{
    char i=49;
    printf("%d",i);
    return 0;
}

为什么输出是49?

我使用%d打印字符,而我的字符声明也是错误的。

3 个答案:

答案 0 :(得分:1)

在C中,char表示与字节相同的东西;它是最小的可寻址内存块,也是最小的整数类型。 49是具有值int的类型49整数常量'1'是一个字符常量,也有int类型!并在ASCII系统'1'上作为值49(字符1的ASCII代码)。

printf转换说明符%d期望相应的参数为int,然后以十进制表示法打印其值。格式字符串后面的其余参数受默认参数提升的约束;每个小于int的整数类型都会提升为int;并且float被提升为double。由于i的整数类型小于int,因此其值(49)现在被提升为int和printf,它看起来与给出任何其他整数值49完全相同

要打印字符代码为49字符,您需要使用%c转换说明符;然后printf将输出1,这是代码49的字符;即使是现在,论证也会提升为intprintf会在内部将该值转换为 unsigned char ,然后输出(source)

  

c

     

[...] int参数转换为unsigned char,并写入结果字符。 [...]

附录:代码

char i = 49.012;
printf("%f", i);

49.012double类型的值;通过砍掉小数将其转换为char范围整数,因此i中存储的值再次 ;哪一个可以用%d打印来证明。现在,%f期望相应的参数的类型为double,但i会转换为int;在调用printf时使用错误类型的参数具有未定义的行为,即任何事情都可能发生。如果使用gcc -Wall进行编译,则会产生以下错误:

  

警告:格式%f需要double类型的参数,但参数2的类型为int [-Wformat =]

答案 1 :(得分:0)

根据评论更新答案。

char是integer类型,您为此整数类型指定49。 %d转换说明符打印整数值;

char i=49;

如果使用"%c"进行打印,则可以看到ascii值为49的相应字符,即1

由于您使用"%d",因此您将获得整数值。

你可以试试这个

char i='1';

现在尝试printf("%d",i); 您将获得49

答案 2 :(得分:0)

%d,%c,%o,%x ...这些称为格式说明符。它将决定你想要的输出类型。

在您的示例中,您为我分配了49并向编译器说您希望输出为十进制。

如果您尝试通过用%c替换%d来打印它,那么它将打印

1因为它假定输出应该以等价于给定数字的char的形式打印

其中ASCII表49为1

和FYI

在printf函数的实现中,它们将处理'%'符号,后跟字符作为特例

如果后面的字符有效,那么它将输出

%x是十六进制 %d是十进制 %i是整数 %c是字符 %s是字符串 %f是浮点数 ...............等 你可以google“c中的形式说明符”,会有很多结果

希望此信息对您有用。