初学C语言时,总感觉 数字 和 字符 之间的界限很模糊。有时明明应该是 char 类型的变量,粗心定义为 int 类型,程序竟然也能正常运行。而读取字符的 getchar函数 和打印字符的 putchar函数,返回类型竟然是 int。为什么数字和字符之间可以“越俎代庖“?两者的区别究竟是什么?
随着对C语言理解的深入,我对上述问题有了一定的理解。请听我娓娓道来:
在日常生活中,计算机要处理各种各样的信息 (数字、文字、符号、图形、音频、视频等),虽然这些信息在人类眼中是不同的,但在计算机的内存中,它们都以二进制数字的形式存储。
十进制数字 (整型) 直接转化为二进制存储,字符类型按照ASCII码转化为二进制存储,其他类型的数据也会按照不同的规则,转化为二进制数字存储。
所以,数字和字符,乃至其它类型的数据,本质上是一回事儿。在计算机内存中,谁还不是二进制了?重点是,你以怎样的视角去看待,在怎样的场景去使用。
就像一本厚厚《C Primer Plus》,学习编程时,它是一本详细全面的经典教材;遇到突发情况时,抡起来似乎也是不错的防身武器。运用之妙,存乎一心。
内存中的 01110010(十进制:114),如果 printf(“%d”); 那就是数字114;如果 printf(“%c”); 那就是ASCII码中114对应的r。
反过来,无论是定义一个char ch = ‘r’; 或者 int num = 114; ,在计算机的内存中,都存储为 01110010。
我可以 printf(“%c”, num); 打印一个r,也可以 printf(“%d”, ch); 打印一个114。因为它们本质上是一样的,区别只在于我创造了什么场景,以怎样的方式使用。
下面,请看代码:
#include <stdio.h>
int main()
{
char ch1 = '\1';
char ch2 = 1;
char ch3 = '1';
printf("%d\n", ch1);
printf("%d\n", ch2);
printf("%d\n", ch3);
printf("%c\n", ch1);
printf("%c\n", ch2);
printf("%c\n", ch3);
return 0;
}
你能否判断出上述程序的输出结果?
‘\1’ 是转义字符,反斜杠后跟三位八进制数字,代表这个八进制数字转化为ASCII码值对应的字符。八进制的1,也是十进制的1,转化为2进制在内存中就是一群0和一个1。
1 就是数字1。在数值上和 ‘\1’ 相等,在内存中显然也一样。
‘1’ 是字符1,对应ASCII码值 49,在内存中就是二进制的49。
所以,按照 %d 形式打印,结果就是 1 1 49。
按照 %c 形式打印,就是 两个ASCII中1对应的字符(我也不清楚是啥),以及一个字符1.
程序运行结果如下,我们的分析是正确的。
(希望我有讲清楚数字和字符的区别)
End
本人小白,若有疏漏,请各位大佬多多包容、指正!
如果对你有帮助的话,不要吝惜你的点赞哦~