(字符型变量你懂吗?)乐创DIY C语言讲义​——3.5节

3.5 字符型变量

前面我们说了,C语言基本类型中的无符号字符型类型,都是被定义用来存储一个字节的无符号数据的。这种类型的变量,以后如果大家做底层编程的时候,用的非常多。

首先我们先来思考一个问题,一般我们生活中,碰到的所有数字都是有理数,只有一些从事科学研究的人员,可能终日会和无理数或者序数打交道。我们遇到的有理数包含了正数和负数两种,比如当你问别人年龄,“您贵庚啦?”别人回答你,“18岁”,虽然在我们平时的使用中,年龄不可能会出现负数,但年龄还是一个有符号的数据类型。同样的,我们身边充斥着各种各样与数量有关的东西,都应该用有符号类型的正数变量来表示。那无符号类型的变量会出现在哪里呢?比如一串数字,只代表一种特定的意思,比如电话号码,邮编之类的数字,这些数字从根本上就不存在正负之分,因此都属于无符号数的范围。然而上述的有符号数和无符号数只是相对来说的,我们编程的时候要充分转动大脑,让书本上的知识活动起来。比如你在面对一块内存只有一百个字节的单片机编程时,需要定义一个变量来存储某个公司的人口,约200人。如果我们看到这个需求的时候,理所当然地想,由于数量这种东西是有符号的数据,因此需要定义一个有符号的变量来定义,又考虑到这个范围超出了一个理所当然定义了一个int类型的变量,但是面对这么小容量的系统,哪怕一个字节都需要操作者考虑再三省着用。而这里的公司人口不可能会出现负数,因此直接定义一个unsigned char类型的变量,完全可以存下这个数据。

unsigned char类型,其长度正好为1个byte,而且这个byte里面不存在任何的特殊信息,完全就是二进制数,因此非常适合来定义一些特定的东西。比如,串口通讯一般都是以单独的字节数据组装成一个信息帧,CAN总线协议也是以8个字节数据组装成一个标准帧,这些场合使用unsigned char类型直接可以将数据读取过来,而不需要做额外的操作,因此非常合适。还有一个场合,比如单个字节内存的访问,单片机的IO口数据,都非常适合unsigned char发挥最大作用。

同样的,有符号字符型变量也可以被用来定义变量存储数据,但这里比较有意思的是,有符号字符型变量设计之初,就是被用来存储一些字母,标点符号信息的。这个故事很漫长,还要从ASCII码说起。

ASCII码是美国信息交换标准代码是由美国国家标准学会(American National Standard Institute , ANSI )制定的,是一种标准的单字节字符编码方案,用于基于文本的数据。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,后来它被国际标准化组织(International Organization forStandardization, ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。ASCII码的诞生,解决了计算器如何显示拉丁字母,数字信息,常用符号的问题,通过将这些字母,数字,符号进行编码,就可以将数字和字符一一对应起来。最早的ASCII码表,一共有128个字符信息,后来又扩充到了256个,一般我们现在常用的还是128个字符信息的ASCII码表,如图3-5-1所示。

图3-5-1 128个字符的ASCII码表

第0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

第32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。

第65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

举例来说,如果我有一个小写字母a,在计算机里存放的就是97,大写字母A,在计算机里存放的就是65,数字0,在计算机里存放的就是48,而当我们需要用printf函数打印它们时,只要把控制符写成“%c”,编译器在编译的时候,就会将其作为字符型的数据打印出了,而不会打印出这些数字。

而C语言里面的字符型类型char,虽然也是字符型,但是却和字符没有必然的关系,我们可以将一个字符型数值存入char类型的变量中去,但是并不是说存进char类型变量中的都是字符型变量。

接下来,我们来编写一个程序,还是打印出“Hello World!”这句话。这句话里一共有12个字符,在C语言中,字符两边必须加英文状态下的单引号,如“’a’”。在这句话里面的12个字符分别是’H’,’e’,’l’,’l’,’o’,’ ’,’W’,’o’,’r’,’l’,’d’,’!’。那我们暂时先定义12个字符型变量的变量名分别是Char0~Char11。然后依次用printf函数打印出来。具体代码和运行结果如3-5-2所示。

图3-5-2 字符打印

接下来,我们可以将代码中的char类型变量,全部换成int,看一下最终打印出来的结果会变成什么样。如图3-5-3所示。

图3-5-3 int类型变量当字符型变量打印

由图3-5-3我们可以看出,虽然把所有字符型变量改成了整形变量,但是用printf函数将它们用字符参数打印出来的时候,还是可以打印出字符。因此正如我们上面所说,字符型变量并不是只能存放字符数据,而字符数据也不是只能放在字符型变量里,总结一下就是,C语言中的基本数据类型,只和存储对象的大小,存储方式有关系,和具体存入的内容没有丝毫关系。

最后,我们使用printf函数的“%u”控制符随便打印一个字符变量,以读取其存储的二进制数。如图3-4-5所示。

图3-5-4查看字符型变量的存储内容

对比一下前面的ASCII码表,可以发现大写字母H的ASCII码就是72,小写字母e的ASCII码就是101。可以得出最终的一个结论,当对变量赋值一个字符的时候,本质上存储的是这个字符的ASCII码。

(0)

相关推荐