版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 如何存储和获取数据变量及数据类型,上一章中读者对C语言有了一个大概的了解,认识了函数,关键字,变量和数据类型。数据和操作是构成程序的两个最基本的要素。本章详细讨C语言描述数据的形式和对数据的基本操作。,4.1 二进制、八进制、十六进制,二进制、八进制、和十六进制是计算机中常用的进制形式。N进制的计数法,就是“逢N进一”。 (1)二进制 二进制数是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”, (2)八进制 八进制数是用0-7共8个数码来表示的数。它的基数为8,进位规则是“逢八进一”, (3)十六进制 十六进制有0-9和A-F16个字符表示。它的基数是16,进位规则是
2、“逢十六进一”, 把十进制、二进制、八进制、十六进制对应起来查看进制转换表如所示。,4.2 计算机中如何表示数据字节和位,程序员编写的程序以及所使用的数据在计算机的内存中是以二进制位序列的方式存放的。典型的计算机内存段二进制位序如下: 0001000101010101000101010111011001010010100100010010010010. 上面的二进制位序里,每一位上的数字,要么是0,要么是1。在计算机中,位(bit)是含有0或者1值的一个单元。在物理上,它的值是一个负或是一个正电荷。也就是计算机中可以通过电压的高低来表示一位所含有的值。如果是0,则用低电压表示,如果是1,则用高
3、电压表示。 在上面的二进制位序这个层次上,位的集合没有结构,很难来解释这些系列的意义。为了能够从整体上考虑这些位,于是给这些位序列强加上结构的概念,这样的结构被称作为字节(byte)和字(word)。通常,一个字节由8位构成,而一个字由32位构成。或者说是4个字节构成。,4.3 内存是存储数据的“房间”认识计算机内存,计算机中的内存是以位为最小存储单位的。通过对内存进行组织,可以引用特定的位集合。把计算机的内存起始位编号为1,每隔8位编号增1,也就是以字节为单位,每隔一个字节编号向上加一,可以对计算机所有内存进行编号。如表43所示。,4.4 数据类型,在前面的章节里,声明变量的时候需要指明数据
4、类型,声明函数的时候,也需要指明函数的返回值数据类型。数据类型是对程序所处理的数据的“抽象”,将计算机中可能出现的数据进行一个分类,哪些数据可以归结为一类,哪些数据又可以归结为另一类。比如整数1,2,3,-1,-2,0,1000,归结为整数类型;带小数点的数据,比如12.1,2343.34,-23434.33,归结为实数类型。 C语言规定,在程序中使用的每一个数据,必须指定其数据类型。本节不做任何解释,先请读者思考,C语言这么规定是为了什么原因。在C语言中,提供了非常丰富的数据类型,如列出了C语言提供的所有类型:,4.4.1 整数类型,整数是日常生活和计算机中用得最频繁的数据类型,也比较容易理
5、解。整数从数学意义上来说就是从负无穷到正无穷之间的任意整型的数据,也就是任意自然数(如1,2,3,4,5)以及它们的负数或0。如果用十进制表示一个自然数,十进制的位数越多,表示的整数也越大。在计算机中用二进制表示数据,二进制的位数不能无限使用,所以在计算机中,整数有一定的大小限制,只可能在一定的范围之内。 在以前内存“寸土寸金”的时代,哪怕是为了节约2个字节的内存,也是非常有必要的。所以C语言的整数类型,又分为短整型(short)、普通整型(int)和长整型(long)三种。C标准并没有具体规定各种整型应该占多少字节,只是要求int型占用的长度应大于或等于short,而又小于或等于long型占
6、用的字节。不同的C语言编译器可能有不同的规定。一般来说,short占用2个字节(16位),int占用4个字节(32位),long占用4个字节(32位)。,4.4.2 整数的正负有符号和无符号,上面论述的只关注了正整数,负数在计算机中该如何表示呢?请读者跟随笔者的推理过程来得到一个解决方案。正数和负数是两种情况,计算机又是一个很笨的东西,要区分两种情况,就必须有一个标记来表示是哪种情况。两种情况,用二进制的一位刚好可以表示,比如用0表示正数,1表示负数,刚好可以区分清楚。那么一个4字节也就是32位存储单元的整数,应该用哪一位表示数据的正负号呢?最简单的方法就是用最高位(就是最左边那一位)了。C语
7、言中确实就是用最高位来表示一个整数的正负号,0表示为正,1表示为负。 某些时候,可能并不需要正负号,比如使用自然数的时候,如记录中国的人口,考试分数,年龄等。那么就可以不要符号位,而节约一个二进制位,从而可以表达的数就更大了。于是C语言提出了有符号和无符号的概念。,4.4.3 实数类型,在计算机中表示整数比较简单,但表示带有小数点的数据却稍微麻烦了一些。如何确定小数点的位置呢?通常有两种方法:一种是规定小数点位置固定不变,称为定点数。另一种是小数点的位置不固定,可以浮动,称为浮点数。在计算机中,通常是用定点数来表示整数和纯小数,分别称为定点整数和定点小数。对于既有整数部分、又有小数部分的数,一
8、般用浮点数表示。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如123.45 用十进制科学计数法可以表达为1.2345 102 ,用科学计数法表示为1.2345e2。其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。,4.4.4 字符类型,字符类型的数据,如字符a、A、?、3、0、=等在计算机内存中用相对应的ASCII码表示。如c的ASCII码为99,则在内存中存储的数据是0110 0011。 字符型数据中计
9、算机中只占用1个字节(8位)的存储单元。ASCII码也是一个整数,可以把ASCII码等作整型数据。所以字符类型可以看作是整数类型。只是字符类型的数据只占用一个字节的存储单元而已。如下列代码片段就是将字符型数据当作整数看待: char c=c; printf(“nc=%d”,c); 输出结果是: c=99 由于字符c对应的ASCII码是99,所以按照整数的方式打印,得到结果是99。 printf(“n%c”,99); 读者可以试验上面的一行代码,看看打印的结果是什么。结果为: c,4.4.5 数据类型总结,归纳起来,上面讲述的类型可得到表47。,4.5 常量,正如第3章所述,变量为程序员提供了一
10、个有名字的内存存储区,可以通过程序对其进行读、写和其他操作。C语言中,每个变量都与一个特定的数据类型关联,该数据类型表示对该变量对应的内存中的数值如何解释,如一个int型和unsigned int型的变量,内存中的数值一样,但是得到的结果却不一样。 常量是指直接出现在计算机指令中的数值。如代码 x+3,其中x是一个变量,其具体数值需要通过变量名去找寻对应的内存空间中的值;3,就是常量,无需到别的地方去寻找。,4.5.1 直接常量(字面常量)和符号常量,直接常量就是一般所说的常数。如一周7天,7是一个固定的常数。因为从字面上就可以看出其具体意义,因此又称做字面常量。常量也有不同的数据类型。如7是
11、一个整型常量。a,是一个字符型常量。3.1415926是一个实型常量。 是求圆周长和面积的C程序:,4.5.2 符号常量的优点,虽然在程序开发中,没有强制规定使用字面常量还是使用符号常量,但是使用符号常量比直接使用字面常量有更明显的优点,如下: (1)通过有意义的单词符号,可以指明该常量的意思,使得程序员在阅读代码时,减少迷惑。 (2)需要修改常量的时候,可以只需要修改一次,实现批量修改,效率高而且准确。 如中需要将PI修改成3.14的话,只需要更改代码行: #definePI 3.1415926 为 #definePI 3.14,4.5.3 字面常量的书写格式,在代码中出现的字面常量,其书写
12、格式多种多样,比如整型常量,有十六进制的书写格式,有8进制的书写格式。实型变量也有不同的格式。 (1)整型常量 在代码中,C整型常量有3种表现形式 十进制整数。 直接书写,没有特殊要求。如123,-45,0。 八进制整数。 (2)实型常量 实型常量只有十进制的表现形式,没有十六进制和八进制的表示。实型常量在C语言中有两种表示形式: (3)字符常量 凡是用键盘可以正常输入的字符均可作为字符常量。如a、0、?、A等。需要注意到是,在C语言源代码中,字符常量必须使用单引号括起来。不能没有,如a,如此一来,编译器将认为a是一个变量或者是一个函数或者是其他有名字的对象。不能使用双引号“”扩起来,“”括起
13、来的又另外的含义,稍后讲述。,4.5.4 转义字符,在计算机中,有一批特殊形式的不可打印字符、单引号、双引号、反斜杠、回车退格等,需要用转义系列表示。前面的章节中printf函数使用的n就是一种以“”开头的字符序列,代表了换行的意思。这种非显示字符难以用一般形式的字符表示,所以C语言规定用“”开头的字符其后跟随的字符用另外的意思代替,“”及其后有特殊意义的字符序列称作转义字符。 常用的转义字符见。,4.5.5 字符串,在C语言中,把用双引号“”括起来的多个字符或者0个字符称为字符串。如”hello”、”A”、”、”How are you?n yes Im a boy.!102”。同字符常量一样
14、,字符串使用双引号界定。双引号内可以插入任何转义字符。比如插入单引号,使用,插入双引号使用”。 字符串中的字符个数称为该字符串的长度。转义字符当作一个字符看待。如“hello”,字符串长度为5,字符串长度为0,“A”字符串长度为1,“yesn”字符串长度为4。聪明的读者可能已经发现,不同的字符串,其字符数长度不一样。前面的章节介绍过,C语言采用“起始地址+内存长度”的方式来从计算机内存中获取数据。现在字符串长度不定,计算机如何存储这些字符串,又如何获取这些字符串呢?,4.6 变量,读者现在对变量应该不陌生了。变量和常量相对,常量就是常数,不会变化,数值7写入代码,将永远是7。变量会变化,变量之
15、所以会变,是因为其存储空间容许它变。C语言通过变量名来引用该变量的值。,4.6.1 变量的声明,在声明变量的时候,需要给这个变量一个名字。有了这个名字之后才能使用这个变量。回顾曾经编写的C语言代码,可以发现这些代码中,凡是用双引号括起来的部分,都是字符串。那些没有用引号括起来的单词,一部分是C语言提供的关键字,比如#define、int、double等,还有一部分是C语言提供的符号,如=、+、-、()、等,这些单词和符合就是C语言的核心部分,编译器生来就认识它们。另外没有使用双引号括起来的单词,如int i_numbers,其中的int是关键字,i_numbers,就是非C语言的关键字,对于编
16、译器来说,它是不认识的,如何让编译器知道这个单词是什么意思,所以有了声明(declare)。 对C编译器来说,每次它刚开始工作的时候,谁也不认识,不知道有哪些变量,不知道有哪些函数,也不知道有哪些符号常量。如果它突然从代码里读入了一个单词,既不是关键字,又不是自己认识的东西,编译器就会认为这是一个没有声明的东西,因为不认识它,所以不知道如何处理。所以“声明”,就是告诉编译器有这么一个东西。,4.6.2 变量声明的意义,C语言为什么要规定先声明变量呢?为什么要指定变量的名字和对应的数据类型呢? (1)建立变量符号表。 通过声明变量,编译器可以建立变量符号表,如此一来,程序中用到了多少变量,每个变
17、量的类型是什么,编译器非常清楚,是否使用了没有声明的变量,编译器在编译期间就可以发现。从而帮助了程序员远离由于疏忽而将变量名写错的情况。 (2)变量的数据类型指示系统分配多少内存空间。 (3)变量的数据类型指示了系统如何解释存储空间中的值。 读者已经明白,同样的数值,不同的类型将有不同的解释。int占据4个字节,float也占据4个字节,在内存中同样也是存储的二进制数,并且这个二进制数也没有标志区分当前是int型还是float型。如何区分?就是通过变量的数据类型来区分。由于声明建立了变量符号表,所以系统知道变量该如何解释。 (4)变量的数据类型确定了该变量的取值范围 例如短整型数据取值-327
18、6732767之间。 (5)不同的数据类型有不同的操作 如整数可以求余。C语言用符号”%”表示求余。如10%2表示10除2的余数。10%2的值为0,即10除以2商5余0。而实型数据就不可以。,4.6.3 变量的名字,在声明变量的时候,要告诉编译器变量的名字。这个名字被称作标志符(identifier),简单的说,标志符就是一个名字,一个在某范围内唯一的名字,通过这个名字,就能找到一个唯一与之对应的对象。变量名,通过名字可以找到变量的值;符号常量名,通过名称可以找到符号常量代表的实际值;函数名,通过名字可以调用函数;数组名,类型名,文件名等都是一个标志符。在很多时候,将标志符简称为ID,就是id
19、entifier的前两个字符缩写。标志符必须在某个范围内是唯一的,所谓某个范围内,在以后的章节会继续讲述。正如在中国,身份证是一个人的ID,在全中国唯一,通过身份证ID就能找到一个具体对应的人。,4.6.4 变量在内存中占据的空间和变量的值,空间大小占用也不同。前面章节已经说了很多次了。现在的计算机,一般可以访问从04GB空间大小的内存,这4GB的内存空间,如何划分不同的区域,是非常有讲究的。就像北京城市,哪里是文教区,哪里是商贸区,哪里是行政区,都划分明确。否则的话,乱七八糟,杂七杂八,政府很难管理。 计算机也一样,管理这么大的内存,也要分段管理。就是说,从内存某地址开始到某地址结束,是操作
20、系统使用的内存区域,普通程序想要使用那是难上加难。在普通程序使用的内存区域里,又有很多类型的内存区域。一般可以认为被分成了堆、栈、全局/静态存储区和常量存储区几个区域。这些区域有各自的特点。常量当然是放在了常量存储区里,所以保证了数据不被修改。变量放在了其他的几个区域。,4.6.5 变量赋初值,程序设计中,经常需要对一些变量预先设定初值。所谓初值,就是分配内存后填入的第一个值。 C语言规定,在声明变量的时候,可以给变量赋初值。 。如: int i_numbers=3;/*声明i_numbers为整型变量,初值为3*/ float f_price=12.9;/*声明f_price为实型,初值为12.9*/ charc_letter=c;/*声明c_letter为字符型,初值为c*/ 对于系统来说,类似int i_numbers=3;的语句,系统分如下几步动作: (1)编译器添加一个变量名到变量符号表中。 (2)编译器在栈内存中分配一个4字节的内存块。 (3)编译器在变量符号表中关
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度电气设备安装与维修合同
- 总经理聘请合同模板
- 房地产代理合同范文:委托与代理
- 代理合同:房地产估价委托协议书
- 广告业务经营权转让合同
- 产品责任保险合同专业版解析
- 自动化机器租赁协议
- 2024装修工程转包合同范本
- 年度长期合作协议范例
- 全面购销合同模板珍藏
- 君子自强不息课件
- 2022人教版高二英语新教材选择性必修全四册课文原文及翻译(英汉对照)
- WDZANYJY23低压电力电缆技术规格书
- 抗高血压药物基因检测课件
- 医院管理医院应急调配机制
- (公开课)文言文断句-完整版课件
- 小学生性教育调查问卷
- 医院感染管理质量持续改进反馈表
- 旅游行政管理第二章旅游行政管理体制课件
- 学生岗位实习家长(或法定监护人)知情同意书
- 卫生院关于召开基本公共卫生服务项目培训会的通知
评论
0/150
提交评论