第2章 数据类型与运算符1207文档格式.docx
- 文档编号:21386882
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:43
- 大小:560.33KB
第2章 数据类型与运算符1207文档格式.docx
《第2章 数据类型与运算符1207文档格式.docx》由会员分享,可在线阅读,更多相关《第2章 数据类型与运算符1207文档格式.docx(43页珍藏版)》请在冰豆网上搜索。
0100
9
1001
从表2-1可以看出,当用二进制表示十进制数字2时,由于二进制的符号只有0和1,所以根据“逢二进一”的规则,需要向高位进一位,表示为0010。
同理,使用二进制表示十进制数字4时,继续向高位进一位,表示为0100。
需要注意的是,十进制和二进制只是针对数字的不同表示方式,无论采用哪种方式表示一个数,它的值都是一样的。
以十进制数7为例,十进制由符号“7”组成,而二进制由符号“0”、“1”、“1”和“1”组成。
2、八进制
八进制是一种“逢八进一”的进制,它由0~7这八个符号来描述。
同样地,此处通过十进制和八进制的对比来描述八进制的表示方式,如表2-2所示。
表2-2十进制与八进制对照表
八进制
11
10
12
13
14
15
16
17
20
21
从表2-2中可以看出,当使用八进制表示十进制数字8时,由于表示八进制的符号只有0~7,因此,根据逢八进一的规则,需要向高位进一位,表示为10。
同理,使用八进制表示十进制数字16时,继续向高位进一位,表示为20。
3、十六进制
十六进制是一种“逢十六进一”的进制,它由0~9、A~F这十六个符号来描述。
下面通过十进制和十六进制的对比来描述十六进制的表示方式,如表2-3所示。
表2-3十进制与十六进制对照表
十六进制
18
19
22
23
24
25
26
1A
A
27
1B
B
28
1C
C
29
1D
D
30
1E
E
31
1F
F
32
33
从表2-3中可以看出,当使用十六进制表示十进制数字16时,由于表示十六进制的符号只有0~9、A~F,因此,根据逢“逢十六进一”的规则,需要向高位进一位,表示为10。
同理,使用十六进制表示十进制数字32时,继续向高位进一位,表示为20。
2.1.2进制转换
通过前面内容的学习,读者应该知道在计算机中一个数值可以用不同的进制形式来表示,但实际上,不管是哪种进制形式来表示,数值本身是不会发生变化的。
因此,各种进制之间可以轻松地实现转换,下面就以十进制、二进制、八进制、十六进制为例来讲解如何实现进制转换。
一、十进制与二进制之间的转换
十进制与二进制之间的转换是最常见也是必须掌握的一种进制转换方式,下面针对十进制转二进制和二进制转十进制的方式分别进行讲解。
1、十进制转二进制
十进制转换成二进制可以采用除2取余的方式。
也就是说将要转换的数,先除以2,获得商和余数,将商继续除以2,获得商和余数,此过程一直重复直到商为0。
最后将所有得到的余数倒序排列,即可得到转换结果。
接下来就以十进制的6转换为二进制为例进行说明,其演算过程如图2-1所示。
图2-1十进制转二进制
从图2-1中可以看出,十进制的6连续三次除以2后,得到的余数依次是:
0、1、1。
将所有余数倒序排列后为110,因此,十进制的6转换成二进制后的结果是110。
2、二进制转十进制
二进制转化成十进制要从右到左用二进制位上的每个数去乘以2的相应次方,例如,将最右边第一位的数乘以2的0次方,第二位的数乘以2的1次方,第n位的数乘以2的n-1次方,然后把所有乘的结果相加,得到的结果就是转换后的十进制。
例如,把一个二进制数01100100转换为10进制,转换方式如下:
0*20+0*21+1*22+0*23+0*24+1*25+1*26+0*27=100
由于0乘以多少都是0,所以上述表达式也可以简写为:
1*22+1*25+1*26=100
得到的结果100就是二进制数01100100转化后的十进制表现形式。
二、八进制与二进制之间的转换
该类转换通常是二进制转换成八进制,在转换的过程中有一个技巧,就是将二进制数自右向左每三位分成一段(若不足三位,左边用0补齐),然后将二进制每段的三位转为八进制的一位,转换过程中数值的对应关系如表2-4所示。
表2-4二进制和八进制数值对应表
000
001
010
011
100
101
110
111
接下来,就以将二进制数00101010为例来演示如何转为八进制,具体演算过程如下:
(1)每三位分成一段,结果为:
000101010;
(2)将每段的数值分别查表替换,结果如下:
0102
1015
0000
(3)将替换的结果进行组合,组合后的八进制为0052(注意八进制必须以0开头)。
八进制转换成二进制的过程正好相反,只需将八进制数中每一位数转换成对应的三位二进制数即可。
三、十六进制与二进制之间的转换
将二进制转十六进制时,与转八进制类似,不同的是要将二进制数每四位分成一段(若不足4位用0补齐),查表转换即可。
二进制转十六进制过程中数值的对应关系如表2-5所示。
表2-5二进制和十六进制数值对应表
1010
1011
1100
1101
1110
1111
接下来,二进制数01010110转为十六进制,具体步骤如下:
(1)每四位分成一段,结果为:
01010110;
01106
01015
(3)将替换的结果进行组合,转换的结果为:
0x56或0X56(注意十六进制必须以0x或者0X开头)。
上述讲解了二进制与其他进制的转换,除二进制外,其他进制之间的转换也很简单,只需将它们转换成二进制数,然后将二进制转为其他进制即可。
多学一招:
小数的二进制
十进制小数转换为二进制采用“乘2取整”规则。
方法是用2乘以十进制小数部分,将其结果的整数部分去掉,用2乘以余下的小数部分,再去掉其结果的整数部分;
如此继续下去,直到余下的小数部分为0或满足所要求的精度为准。
最后将每次得到的整数部分(0或1)按先后顺序从前至后排列,即为小数对应的二进制。
例如:
将小数0.8125转换为二进制,转换过程如图2-2所示。
图2-2十进制小数转换为二进制
由图2-2所示十进制0.8125连续4次乘以2使得小数部分为0,所得整数依次为1、1、0、1,所以转换后结果为0.1101。
需要注意的是,有些十进制小数不一定能完全精确的转换为二进制,可以根据精度要求转换到小数点后某一位为止。
2.1.3原码、反码、补码
一个数在计算机中的二进制存储形式,叫做这个数的机器数。
机器数是带符号的,在计算机中用一个数的最高位存放符号,最高位为0表示是正数,最高位为1表示是负数。
比如十进制数3的机器数是00000011;
如果是-3,它的机器数就是10000011。
带符号位的机器数对应的真正数值称为机器数的真值。
例如,00000011的真值是3,10000011的真值是-3。
需要注意的是,机器数的真值和机器数转换成十进制数是不一样的,例如10000011转换成十进制数是131,但由于机器数的最高位存放符号,因此机器数的真值是-3。
机器数有原码、补码、反码这三种表现形式。
计算机将一个数以二进制形式存储时,会将该数分别进行求原码、求反码、求补码这三步操作,最终将得到的机器数存入内存。
1、原码
原码就是符号位加上真值的绝对值。
例如,1的原码为00000001,-1的原码为10000001。
2、反码
反码的表示方法是:
正数的反码是其原码,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
例如1的原码是00000001,反码也是00000001,而-1的原码是10000001,反码则是11111110。
3、补码
补码的表示方法是:
正数的补码就其原码,负数的补码是在其反码的基础上+1。
例如1的原码是00000001,反码是00000001,补码也是00000001,而-1的原码是10000001,反码是11111110,补码则是11111111。
最终一个数的补码就是该数在计算机中以二进制形式存放的机器数,例如数值1在计算机中的二进制形式为0000001,而-1在计算机中的二进制形式为11111111。
2.1.4原码、反码、补码的应用
通过前面的讲解,我们了解了原码、反码和补码,反码与补码的出现就是为了解决以下问题:
●使符号位能与有效值部分一起参加运算,从而简化运算规则。
●使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
接下来将通过两个案例来详细讲解原码、反码和补码在计算机减法运算中的应用。
1、机器数转换成真值
假设长度为2个字节的内存空间中存放着二进制数1001001000111001,那么这块内存空间中存放的整数的数值是多少?
因为计算机中用一个数的最高位存放符号,最高位为0表示是正数,最高位为1表示是负数,所以该整数是负数。
推导过程如下所示:
(1)因为负数在内存中以补码的形式存放,所以二进制数1001001000111001是该负数的补码;
(2)因为负数的补码是在其反码的基础上+1,所以该负数的补码是二进制数1001001000111000;
(3)因为负数的反码是在其原码的基础上,符号位不变,其余各个位取反,所以该负数的原码是二进制数1110110111000111;
(4)无视最高位的数值,二进制数0110110111000111转换成十进制数就是28103,再添加上符号,那么二进制数1001001000111001的真值就是-28103。
2、计算1-1的值
计算机计算1-1的值的步骤具体如下:
(1)将算式1-1转换成算式1+(-1);
(2)将算式中的数字转换成原码,算式就成为:
00000001+10000001;
(3)原码转换成反码,算式就成为:
00000001+11111110;
(4)反码转换成补码,算式就成为:
00000001+11111111;
(5)对补码进行运算,得到结果:
100000000;
(6)因为计算机使用8位二进制数,所以结果的第9位被舍去,所以最终结果是:
00000000;
(7)由于00000000是十进制数0的补码,所以计算机返回十进制数0。
关键字和标识符
2.1.5关键字
所谓关键字是指在编程语言里事先定义好并赋予了特殊含义的单词,也称作保留字。
关键字在程序中用于表示特殊含义,不能被随便用作变量名、函数名等,在C语言中,C89标准中共定义了32个关键字,具体如下:
autodoubleintstructbreakelselong
switchcaseenumregistertypedefcharextern
returnunionconstfloatshortunsignedcontinue
signedvoiddefaultgotosizeofvolatiledo
staticwhileforif
上面列举的关键字中,每个关键字都有特殊的作用,例如,int关键字用于声明一个整型的变量,sizeof关键字用于获取指定类型数据的长度,char关键字用于声明一个字符类型的变量。
在本书后面的章节中将逐步对这些关键字进行讲解,这里只需了解即可。
2.1.6标识符
在编程过程中,经常需要定义一些符号来标记一些名称,如变量名、方法名、参数名、数组名等,这些符号被称为标识符。
在C语言中标识符的命名需要遵循一些规范,具体如下:
●标识符只能由字母、数字和下划线组成。
●标识符不能以数字作为第一个字符。
●标识符不能使用关键字。
●标识符区分大小写字母,如add、Add和ADD是不同的标识符。
●尽量做到“见名知意”,以增加程序的可读性,如用age表示年龄,用length表示长度等。
●虽然ANSIC中没有规定标识符的长度,但建议标识符的长度不超过8个字符。
在上面的规范中,除了最后两条外,其他的命名规范都是必须要遵守的,否则程序就会出错。
为了让读者对标识符的命名规范有更深刻地理解,接下来列举一些合法与不合法的标识符,具体如下:
下面是一些合法的标识符:
area
DATE
_name
lesson_1
下面是一些不合法的标识符:
3a//标识符不能以数字作为第一个字符
ab.c//标识符只能由字母、数字和下划线组成
long//标识符不能使用关键字
abc#//标识符只能由字母、数字和下划线组成
常量与变量
2.1.7常量的概念
常量又称常数,是指在程序运行过程中其值不可改变的量。
C语言中的常量可分为整型常量、实型常量、字符型常量、字符串常量和符号常量,下面将针对这些常量分别进行详细讲解。
1、整型常量
整型常量又称为整数。
C语言中,整数可用三种形式表示,具体如下:
●十进制整数:
十进制整数没有前缀,其数码为0~9,如123、-456、0;
●八进制整数:
八进制整数必须以数字0开头,其数码为0~7,如0123表示八进制整数123、-011表示八进制整数-11;
●十六进制整数:
十六进制整数的前缀为0X或0x,其数码为0~9、A~F或a~f,如0x36C表示十六进制整数36C、-0x12d表示十六进制整数-12d。
2、实型常量
实型也称为浮点型,实型常量也称为实数或浮点数,也就是在数学中用到的小数。
C语言中,实型常量采用十进制表示,它有两种形式:
十进制小数形式和指数形式,具体示例如下:
●十进制小数形式:
由数字和小数点组成(注意:
必须有小数点),如12.3、-45.6、1.0等;
●指数形式:
又称科学计数法,由于计算机输入输出时,无法表示上角或下角,所以规定以字母e或E表示以10为底的指数,如12.34e3(代表12.34×
103)、-34.87e-2(代表34.87×
10-2)、0.14E4(代表0.14×
104)等。
需要注意的是,“e”或“E”之前必须有数字,且“e”或“E”后面必须为整数,如不能写成e4、12e2.5等。
3、字符常量
有两种形式的字符常量:
●普通字符:
用单引号括起来的单个字符,如:
'
a'
、'
Z'
3'
?
#'
。
字符常量存储在内存中时,并不是存储字符(如a、Z、#等)本身,而是以其ASCII码存储的,例如字符'
的ASCII码是97,因此在内存中以二进制形式存放97。
需要注意的是,单引号只是界限符;
字符常量只能是一个字符,不包括单引号,不能写成'
ab'
或'
12'
;
字符常量是区分大小写的,'
和'
A'
是不同的字符常量。
●转义字符:
有些字符是无法用一般形式来表示的,我们可以用转义字符来表示,就是以字符'
\'
开头的字符序列,例如'
\n'
表示一个换行符、'
\t'
表示一个制表符。
常用转义字符如表2-6所示。
表2-6转义字符及其作用
转义字符
对应字符
输出结果
单引号('
)
输出此字符
\"
双引号("
\\
反斜线(\)
\a
警告(alert)
产生声音或视觉信号
\b
退格(backspace)
将当前位置后退一个字符
\f
换页(formfeed)
将当前位置移到下一页的开头
\n
换行
将当前位置移到下一行的开头
\r
回车(carriagereturn)
将当前位置移到本行的开头
\t
水平制表符
将当前位置移到下一个tab位置
\v
垂直制表符
将当前位置移到下一个垂直制表对齐点
\d、\dd、\ddd
1~3位八进制数表示的ASCII码所代表的字符
与该八进制ASCII码对应的字符
\xh、\xhh
1~2位十六进制数表示的ASCII码所代表的字符
与该十六进制ASCII码对应的字符
表2-6中倒数第2行是一个八进制数表示的ASCII字符,例如'
\101'
代表八进制数101的ASCII字符,即十进制数65的ASCII字符'
\012'
代表八进制数12的ASCII字符,即十进制数10的ASCII字符'
表2-6中倒数第1行是一个十六进制数表示的ASCII字符,接下来,通过一个具体的,例来演示转义符的用法,如例22e+23f________________________________________________________________________________________________例如'
\x41'
代表十六进制数41的ASCII字符,也就是十进制65的ASCII字符'
\x20'
代表十六进制数20的ASCII字符,即十进制数32的ASCII字符:
空格字符。
这两个方法可以表示任何可显示的字母字符、数字字符、专用字符、图形字符和控制字符。
计算机使用特定的整数编码来表示对应的字符。
我们通常使用的英文字符编码是
ASCII(AmericanStandardCodeforInformationInterchange美国信息交换标准编码)。
ASCII编码是一个标准,其内容规定了把英文字母、数字、标点、字符转换成计算机能识别的二进制数的规则,并且得到了广泛认可和遵守。
具体请参考附录A中的ASCII码表。
●ASCII非打印控制字符:
ASCII表上的数字0-31分配给了控制字符,用于控制像打印机等一些外围设备(参详ASCII码表中0-31)。
ASCII码中9代表Tab键,10代表换行键,下面将用一个案例来打印其效果,如例2-1所示。
例2-1
1#include<
stdio.h>
2voidmain()
3{
4printf("
a%cb\n"
9);
5printf("
c%cd\n"
10);
6}
运行结果如图2-3所示。
图2-3运行结果
如图2-3所示,a与b之间插入字符9,则a、b之间出现Tab制符表键的效果;
c与d之间插入字符10,则c、d之间出现换行。
●ASCII打印字符:
数字32-126分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。
数字127代表DELETE命令(参详ASCII码表中32-127)。
4、字符串常量
字符串常量是用一对双引号括起来的字符序列,例如"
hello"
、"
123"
itcast"
等。
字符串的长度等于字符串中包含的字符个数,例如,字符串"
的长度为5个字符。
字符串常量与字符常量是不同的,它们之间主要的区别有:
●字符型常量使用单引号定界,字符串常量使用双引号定界。
●字符型常量只能是单个字符,字符串常量可以包含一个或多个字符。
●可以把一个字符型常量赋给一个字符型变量,但不能把一个字符串常量赋给一个字符串变量,C语言中没有相应的字符串变量,只能用字符数组存放字符串常量。
5、符号常量
C语言中也可以用一个标识符来表示一个常量,称为符号常量。
符号常量在使用前必须先定义,其语法格式如下所示:
#define标识符常量
上述语法格式中,define是关键字,前面加符号“#”,表示这是一条预处理命令(预处理命令都以符号“#”开头),称为宏定义。
例如将圆周率用PI表示,可写成:
#definePI3.14
该语句的功能是把标识符“PI”定义为常量3.14,定义后在程序中所有出现标识符“PI”的地方均用3.14代替PI。
符号常量的标识符是用户自己定义的。
符号常量有以下特点:
●习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。
●符号常量与变量不同,符号常量的值在其作用域内不能改变,也不能再被赋值。
●使用符号常量的好处是:
含义清楚,并且能做到“一改全改”。
2.1.8变量的定义
在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。
这些内存单元我们称之为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
接下来,通过一段代码来学习变量的定义,具体如下:
intx=0,y;
y=x+3;
上面的代码中,第一行代码的作用是定义了两个变量x和y,也就相当于分配了两块内存单元,在定义变量的同时为变量x分配了一个初始值0,而变量y没有分配初始值,变量x和y在内存中的状态如图2-4所示。
图2-4x、y变量在内存中的状态
第二行代码的作用是为变量赋值,在执行第二行代码时,程序首先取出变量x的值,与3相加后,将结果赋值给变量y,此时变量x和y在内存中的状态发生了变化,如图2-5所示。
图2-5x、y变量在内存中的状态
从图2-4、图2-5以及上面的描述不难发现,变量实际上就是一个临时存放数据的地方。
在程序中,可以将指定的数据存放到变量中,方便随时取出来再次进行使用。
变量对于一段程序的运行是至关重要的,读者在后
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第2章 数据类型与运算符1207 数据类型 运算 1207