目录
🍊1.数据的表现形式及其运算
🍉1.1常量和变量
🍀1.1.1常量
🍀1.1.2变量
🍀1.1.3常变量
🍀1.1.4标识符
🍉1.2数据类型
🍉1.3整型数据
🍀1.3.1整型数据的分类
🍀1.3.2整型变量的符号属性
🍉 1.4字符型数据
🍀1.4.1字符与字符代码
🍀 1.4.2字符变量
🍉1.5浮点型数据
1.数据的表现形式及其运算
1.1常量和变量
在计算机高级语言中,数据有两种表现形式:常量和变量。
1.1.1常量
在程序运行过程中,其值不能被改变的量称为常量。
常用的常量有以下几类:
(1)整型常量。如1000,12345,0,-345等都是整型常量。
(2)实型常量。有两种表示形式:
①十进制小数形式,由数字和小数点组成。如123.456,0.345,一56.79,0.0,12.0等。
②指数形式,如12.34e3,-346.87e-25,0.145E-25等。由于在计算机输入或输出时无法表示上角或下角,故规定以字母e或E代表以I0为底的指数。但应注意:e或E之前必须有数字,且e或E后面必须为整数。如不能写成e4,12e2.5。
(3)字符常量。有两种形式的字符常量:
①普通字符,用单撇号括起来的一个字符,如:'a','Z','3','?','#'。不能写成'ab'或'12'。请注意:单撇号只是界限符,字符常量只能是一个字符,不包括单撇号。a和'A是不同的字符常量。字符常量存储在计算机存储单元中时,并不是存储字符(如a,z,#等)本身,而是以其代码(一般采用ASCII代码)存储的,例如字符'a'的ASCII代码是97,因此,在存储单元中存放的是97(以二进制形式存放)。ASCII字符与代码对照表如图所示:
②转义字符,除了以上形式的字符常量外,C语言还允许用一种特殊形式的字符常量,就是以字符“\”开头的字符序列。例如,在printf函数中的'\n'代表一个“换行”符。'\t'代表将输出的位置跳到下一个Tab位置(制表位置),一个Tab位置为8列。这是一种在屏幕上无法显示的“控制字符”,在程序中也无法用一个一般形式的字符来表示,只能采用这样的特殊形式来表示。
常用的以“\”开头的特殊字符如图所示:
上表中列出的字符称为转义字符,意思是将“\”后面的字符转换成另外的意义。如“\n”中的“n”不代表字母n而作为“换行”符。
上表中倒数第2行是一个以八进制数表示的字符,例如'\101'代表八进制数101的ASCII字符即'A'(八进制数101相当于十进制数65,从ASCII表中可以看到ASCII码(十进制数)为65的字符是大写字母'A')。'\012'代表八进制数12(即十进制数的10)的ASCII码所对应的字符“换行”符。上表中倒数第1行是一个以十六进制数表示的ASCII字符,如'\x41'代表十六进制数41的ASCII字符,也是A(十六进制数41相当于十进制数65)。用表中的方法可以表示任何可显示的字母字符、数字字符、专用字符、图形字符和控制字符。如'\033'或'\x1B’代表ASCII代码为27的字符,即ESC控制符。\0或\000是代表ASCII码为0的控制字符,即“空操作”字符,它常用在字符串中。
(4)字符串常量。如“boy”,"123"等,用双撇号把若干个字符括起来,字符串常量是双撇号中的全部字符(但不包括双撇号本身)。注意不能错写成'CHINA',boy','123'。单撇号内只能包含一个字符,双撇号内可以包含一个字符串。
(5)符号常量。用#define指令,指定用一个符号名称代表一个常量。如:
#define PI 3.1416 //注意行末没有分号
经过以上的指定后,本文件中从此行开始所有的PI都代表3.1416。在对程序进行编译前,预处理器先对PI进行处理,把所有PI全部置换为3.1416。这种用一个符号名代表一个常量的,称为符号常量。在预编译后,符号常量已全部变成字面常量(3.1416)。使用符号常量有以下好处。
①含义清楚。看程序时从PI就可大致知道它代表圆周率。在定义符号常量名时应考虑“见名知义”。在一个规范的程序中不提倡使用很多的常数,如:sum=15*30*23.5*43,在检查程序时搞不清各个常数究竟代表什么。应尽量使用“见名知义”的变量名和符号常量。
②在需要改变程序中多处用到的同一个常量时,能做到“一改全改”。例如在程序中多处用到某物品的价格,如果价格用一个常数30表示,则在价格调整为40时,就需要在程序中作多处修改,若用符号常量PRICE代表价格,只须改动一处即可:
#define PRICE 40
注意:要区分符号常量和变量,不要把符号常量误认为变量。符号常量不占内存,只是一个临时符号,代表一个值,在预编译后这个符号就不存在了,故不能对符号常量赋新值。为与变量名相区别,习惯上符号常量用大写表示,如PI,PRICE等。
1.1.2变量
变量代表一个有名字的、具有特定属性的一个存储单元。它用来存放数据,也就是存放变量的值。在程序运行期间,变量的值是可以改变的。
变量必须先定义,后使用。在定义时指定该变量的名字和类型。一个变量应该有一个名字,以便被引用。请注意区分变量名和变量值
这两个不同的概念,如图所示,a是变量名,3是变量a的值,即存放在变量a的内存单元中的数据。变量名实际上是以一个名字代表的一
个存储地址。在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。
1.1.3常变量
C99允许使用常变量,方法是在定义变量时,前面加一个关键字 const,如:
const int a=3;
定义a为一个整型变量,指定其值为3,而且在变量存在期间其值不能改变。
常变量与常量的异同是:常变量具有变量的基本属性:有类型,占存储单元,只是不允许改变其值。可以说,常变量是有名字的不变量,而常量是没有名字的不变量。有名字就便于在程序中被引用。
请思考:常变量与符号常量有什么不同?如:
#define Pi31415926 //定义符号常量
const float pi-31415926; //定义常变量
符号常量Pi和常变量pi都代表3.1415926,在程序中都能使用。但二者性质不同:定义符号常量用#define指令,它是预编译指令,它只是用符号常量代表一个字符串,在预编译时仅进行字符替换,在预编译后,符号常量就不存在了(全置换成31415926了).对符号常量的名字是不分配存储单元的。而常变量要占用存储单元,有变量值,只是该值不改变而已。从使用的角度看,常变量具有符号常量的优点,而目使用更方便。有了常变量以后,可以不必多用符号常量。
说明:有些编译系统还未实现C99的功能,因此不能使用常变量。
1.1.4标识符
在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符(identifier)。简单地说,标识符就是一个对象的名字。前面用到的变量名p1,p2cf,符号常量名PIPRICE,函数名printf等都是标识符。
C语言规定标识符只能由字母、数字和下画线3种字符组成,且第1个字符必须为字母或下画线。下面列出的是合法的标识符,可以作为变量名:
sum,average, _total,Class,day,month,Student_name,lotus_1_2_3,BASIC,li_ling。
下面是不合法的标识符和变量名:
M.D.John,¥123,#33,3D64,a>b
注意:编译系统认为大写字母和小写字母是两个不同的字符。因此.sum和SUM是两个不同的变量名,同样,Class和class也是两个不同的变量名。一般而言,变量名用小写字母表示,与人们日常习惯一致,以提高可读性。
1.2数据类型
所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。
其中,基本类型(包括整型和浮点型)和枚举类型变量的值都是数值,统称为算术类型(arithmetic type)。算术类型和指针类型统称为纯量类型(scalartype),因为其变量的值是以数字来表示的。枚举类型是程序中用户定义的整数类型。数组类型和结构体类型统称为组合类型(aggregatetype),共用体类型不属于组合类型,因为在同一时间内只有一个成员具有值。两数类型用来定义函数,描述一个函数的接口,包括函数返回值的数据类型和参数的类型。
不同类型的数据在内存中占用的存储单元长度是不同的,例如,Visual C++为char型(字符型)数据分配1个字节,为int型(基本整型)数据分配4个字节,存储不同类型数据的方法也是不同的。
1.3整型数据
1.3.1整型数据的分类
(1)基本整型( int 型)
编译系统分配给 int 型数据2个字节或4个字节(由具体的C编译系统自行决定)。如 Turbo C 2.0 为每一个整型数据分配2个字节(16个二进位),而Visual C++ 为每一个整型数据分配4个字节(32位)。在存储单元中的存储方式是:用整数的补码(complement)形式存放。一个正数的补码是此数的二进制形式,如5的二进制形式是101,如果用两个字节存放一个整数,则在存储单元中数据形式如图所示:
如果是一个负数,则应先求出负数的补码。求负数的补码的方法是:先将此数的绝对值写成二进制形式,然后对其所有二进位按位取反,再加1。如—5的补码见图:
在存放整数的存储单元中,最左面一位是用来表示符号的。如果该位为0,表示数值为正;如果该位为1,表示数值为负。
(2)短整型( short int )
类型名为 short int 或 short 。如用 Visual C++,编译系统分配给 int 数据4个字节,短整型2个字节。存储方式与 int 型相同。一个短整型变量的值的范围是-32768~32767。
(3)长整型( long int )
类型名为 long int 或 long 。Visual C++对一个 long 型数据分配4个字节(即32位),因此 long int 型变量的值的范围是一231~(231-1),即-2147483648~2147483647。
(4)双长整型( long long int )
类型名为 long long int 或 long long,一般分配8个字节。这是 C99 新增的类型,但许多C编译系统尚未实现。
1.3.2整型变量的符号属性
以上介绍的几种类型,变量值在存储单元中都是以补码形式存储的,存储单元中的第1个二进位制代表符号。整型变量的值的范围包括负数到正数,如图所示:
在实际应用中,有的数据的范围常常只有正值(如学号、年龄、库存量、存款额等)。为了充分利用变量的值的范围,可以将变量定义为“无符号”类型。可以在类型符号前面加上修饰符unsigned,表示指定该变量是“无符号整数”类型。如果加上修饰符signed,则是“有符号类型”。因此,在以上4种整型数据的基础上可以扩展为以下8种整型数据:
有符号基本整型 [signed] int
无符号基本整型 unsigned int
有符号短整型 [signed] short[int]
无符号短整型 unsigned short [int]
有符号长整型 [signed] long[int]
无符号长整型 unsigned long [int]
有符号双长整型* [signed]longlong[int]
无符号双长整型* unsignedlonglong[int]
以上有“*”的是C99增加的,方括号表示其中的内容是可选的,既可以有,也可以没有。如果既未指定为 signed 也未指定为 unsigned 的,默认为“有符号类型”。如 signed int a 和 int a 等价。
有符号整型数据存储单元中最高位代表数值的符号(0为正,1为负)。如果指定 unsigned (为无符号)型,存储单元中全部二进位(b)都用作存放数值本身,而没有符号。无符号型变量只能存放不带符号的整数,如 1234687 等,而不能存放负数,如 一123,-3。由于左面最高位不再用来表示符号,而用来表示数值,因此无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。如果在程序中定义a和b两个短整型变量(占2个字节),其中b为无符号短整型:
short a; //a为有符号短整型变量
unsigned short b; //b为无符号短整型变量
则变量a的数值范围为-32768~32767,而变量b的数值范围为0~65535。如图所示,表示有符号整型变量a的最大值(32 767)
如图所示,表示无符号整型变量b的最大值(65 535)。
1.4字符型数据
由于字符是按其代码(整数)形式存储的,因此 C99 把字符型数据作为整数类型的一种。但是,字符型数据在使用上有自己的特点,因此把它单独列为一节来介绍。
1.4.1字符与字符代码
字符与字符代码并不是任意写一个字符,程序都能识别的。例如代表圆周率的π在程序中是不能识别的,只能使用系统的字符集中的字符,目前大多数系统采用ASCII字符集。各种字符集(包括ASCII字符集)的基本集都包括了127个字符。其中包括:
- 字母:大写英文字母A~Z,小写英文字母a~z。
- 数字:0~9。
- 专门符号:29个,包括:! " # & ' () * + ,- . / : ; < = > ? [ \ ] ^ _ ' { | } ~
- 空格符:空格、水平制表符(tab) 垂直制表符、换行、换页(formfeed)。
- 不能显示的字符:空(null)字符(以\0表示)警告(以\a表示)、退格(以\b表示)回车(以r表示)等。
1.4.2字符变量
字符变量是用类型符char定义字符变量。char是英文char acter (字符)的缩写,见名即可知义。如:
char c='?';
定义c为字符型变量并使初值为字符??的ASCII代码是63系统把整数63赋给变量c。
c是字符变量,实质上是一个字节的整型变量,由于它常用来存放字符,所以称为字符变量。可以把0~127之间的整数赋给一个字符变量。在输出字符变量的值时,可以选择以十进制整数形式输出,或以字符形式输出。如:
printf("%d %c\n",c,c);
输出结果是:
63 ?
1.5浮点型数据
浮点数类型包括 float (单精度浮点型)、 double (双精度浮点型)、 long double (长双精度浮点型)。
(1) float型 (单精度浮点型)。编译系统为每一个float型变量分配4个字节,数值以规范化的二进制数指数形式存放在存储单元中。在存储时,系统将实型数据分成小数部分和指数部分两个部分,分别存放。小数部分的小数点前面的数为0。如3.14159在内存中的存放形式如图所示:
(2) double (双精度浮点型)。为了扩大能表示的数值范围,用8个字节存储一个 double 型数据,可以得到15位有效数字,数值范围为。为了提高运算精度,在C语言中进行浮点数的算术运算时,将float型数据都自动转换为 double 型,然后进行运算。
(3) long double 型(长双精度)型,不同的编译系统对 long double 型的处理方法不同,TurboC对long double 型分配16个字节。而 Visual C++则对 long double 型和 double 型一样处理,分配8个字节。