博学谷——让IT教学更简单,让IT学习更有效
最终一个数的补码就是该数在计算机中以二进制形式存放的机器数,例如数值1在计算机中的二进制形式为0000 0 01,而-1在计算机中的二进制形式为1111 1111。
2.1.4 原码、反码、补码的应用
通过前面的讲解,我们了解了原码、反码和补码,反码与补码的出现就是为了解决以下问题: ? 使符号位能与有效值部分一起参加运算,从而简化运算规则。 ? 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。 接下来将通过两个案例来详细讲解原码、反码和补码在计算机减法运算中的应用。 1、机器数转换成真值
假设长度为2个字节的内存空间中存放着二进制数10010010 00111001,那么这块内存空间中存放的整数的数值是多少?
因为计算机中用一个数的最高位存放符号,最高位为0表示是正数,最高位为1表示是负数,所以该整数是负数。推导过程如下所示: (1)因为负数在内存中以补码的形式存放,所以二进制数10010010 00111001是该负数的补码; (2)因为负数的补码是在其反码的基础上+1,所以该负数的补码是二进制数10010010 00111000;
(3)因为负数的反码是在其原码的基础上,符号位不变,其余各个位取反,所以该负数的原码是二进制数11101101 11000111;
(4)无视最高位的数值,二进制数01101101 11000111转换成十进制数就是28103,再添加上符号,那么二进制数10010010 00111001的真
值就是-28103。 2、计算1-1的值
计算机计算1-1的值的步骤具体如下: (1)将算式1-1转换成算式1+(-1);
(2)将算式中的数字转换成原码,算式就成为:0000 0001 + 1000 0001; (3)原码转换成反码,算式就成为:0000 0001 + 1111 1110; (4)反码转换成补码,算式就成为:0000 0001 + 1111 1111; (5)对补码进行运算,得到结果:1 0000 0000;
(6)因为计算机使用8位二进制数,所以结果的第9位被舍去,所以最终结果是:0000 0000; (7)由于0000 0000是十进制数0的补码,所以计算机返回十进制数0。
2.2 关键字和标识符
2.2.1 关键字
所谓关键字是指在编程语言里事先定义好并赋予了特殊含义的单词,也称作保留字。关键字在程序中用于表示特殊含义,不能被随便用作变量名、函数名等,在C语言中,C89标准中共定义了32个关键字,具体如下:
auto double switch signed static
case
void while
return union
int enum const default
struct float goto
if
break
else
long
register typedef
short sizeof
char
extern
unsigned continue volatile do
for
6
博学谷——让IT教学更简单,让IT学习更有效
上面列举的关键字中,每个关键字都有特殊的作用,例如,int关键字用于声明一个整型的变量,sizeof关键字用于获取指定类型数据的长度,char关键字用于声明一个字符类型的变量。在本书后面的章节中将逐步对这些关键字进行讲解,这里只需了解即可。
2.2.2 标识符
在编程过程中,经常需要定义一些符号来标记一些名称,如变量名、方法名、参数名、数组名等,这些符号被称为标识符。在C语言中标识符的命名需要遵循一些规范,具体如下:
? 标识符只能由字母、数字和下划线组成。 ? 标识符不能以数字作为第一个字符。 ? 标识符不能使用关键字。
? 标识符区分大小写字母,如add、Add和ADD是不同的标识符。
? 尽量做到“见名知意”,以增加程序的可读性,如用age表示年龄,用length表示长度等。 ? 虽然ANSIC中没有规定标识符的长度,但建议标识符的长度不超过8个字符。
在上面的规范中,除了最后两条外,其他的命名规范都是必须要遵守的,否则程序就会出错。为了让读者对标识符的命名规范有更深刻地理解,接下来列举一些合法与不合法的标识符,具体如下:
下面是一些合法的标识符:
area DATE _name lesson_1
下面是一些不合法的标识符:
3a
// 标识符不能以数字作为第一个字符
ab.c // 标识符只能由字母、数字和下划线组成 long // 标识符不能使用关键字
abc#// 标识符只能由字母、数字和下划线组成
2.3 常量与变量
2.3.1 常量的概念
常量又称常数,是指在程序运行过程中其值不可改变的量。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语言中,实型常量采用十进制表示,它有两种形式:十进制小数形式和指数形式,具体示例如下:
7
博学谷——让IT教学更简单,让IT学习更有效
? 十进制小数形式:由数字和小数点组成(注意:必须有小数点),如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码存储的,例如字符'a'的ASCII码是97,因此在内存中以二进制形式存放97。需要注意的是,单引号只是界限符;字符常量只能是一个字符,不包括单引号,不能写成'ab'或'12';字符常量是区分大小写的,'a'和'A'是不同的字符常量。
? 转义字符:有些字符是无法用一般形式来表示的,我们可以用转义字符来表示,就是以字符'\\'开头的字符序列,例如'\\n'表示一个换行符、'\\t'表示一个制表符。常用转义字符如表2-6所示。
表2-6
转义字符 \\' \\\\\\\ \\a \\b \\f \\n \\r \\t \\v 转义字符及其作用
输出结果 输出此字符 输出此字符 输出此字符 产生声音或视觉信号 将当前位置后退一个字符 将当前位置移到下一页的开头 将当前位置移到下一行的开头 将当前位置移到本行的开头 将当前位置移到下一个tab位置 将当前位置移到下一个垂直制表对齐点 对应字符 单引号(') 双引号(\) 反斜线(\\) 警告(alert) 退格(backspace) 换页(form feed) 换行 回车(carriage return) 水平制表符 垂直制表符 1~3位八进制数表示的ASCII\\d、\\dd、\\ddd 码所代表的字符 1~2位十六进制数表示的\\xh、\\xhh ASCII码所代表的字符 与该八进制ASCII码对应的字符 与该十六进制ASCII码对应的字符 表2-6中倒数第2行是一个八进制数表示的ASCII字符,例如'\\101'代表八进制数101的ASCII字符,即十进制数65的ASCII字符'A';'\\012'代表八进制数12的ASCII字符,即十进制数10的ASCII字符'\\n'。表2-6中倒数第1行是一个十六进制数表示的ASCII字符,例如'\\x41'代表十六进制数41的ASCII字符,也就是十进制65的ASCII字符'A';'\\x20'代表十六进制数20的ASCII字符,即十进制数32的ASCII字符:空格字符。这两个方法可以表示任何可显示的字母字符、数字字符、专用字符、图形字符和控制字符。
计算机使用特定的整数编码来表示对应的字符。我们通常使用的英文字符编码是 ASCII(American Standard Code for Information Interchange 美国信息交换标准编码)。ASCII编码是一个标准,其内容规定了把英文字母、数字、标点、字符转换成计算机能识别的二进制数的规则,并且得到了广
8
博学谷——让IT教学更简单,让IT学习更有效 泛认可和遵守。具体请参考附录A中的ASCII码表。
? ASCII非打印控制字符:
ASCII表上的数字0-31分配给了控制字符,用于控制像打印机等一些外围设备(参详ASCII码表中0-31)。ASCII码中9代表Tab键,10代表换行键,下面将用一个案例来打印其效果,如例2-1所示。
例2-1
1 #include
printf(\printf(\
运行结果如图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、字符串常量
字符串常量是用一对双引号括起来的字符序列,例如\、\、\等。字符串的长度等于字符串中包含的字符个数,例如,字符串\的长度为5个字符。
字符串常量与字符常量是不同的,它们之间主要的区别有: ? 字符型常量使用单引号定界,字符串常量使用双引号定界。 ? 字符型常量只能是单个字符,字符串常量可以包含一个或多个字符。
? 可以把一个字符型常量赋给一个字符型变量,但不能把一个字符串常量赋给一个字符串变量,C语言中没有相应的字符串变量,只能用字符数组存放字符串常量。 5、符号常量
C语言中也可以用一个标识符来表示一个常量,称为符号常量。符号常量在使用前必须先定义,其语法格式如下所示:
#define 标识符 常量
上述语法格式中,define是关键字,前面加符号“#”,表示这是一条预处理命令(预处理命令都以符号“#”开头),称为宏定义。 例如将圆周率用PI表示,可写成:
#define PI 3.14
该语句的功能是把标识符“PI”定义为常量3.14,定义后在程序中所有出现标识符“PI”的地方均用3.14代替PI。符号常量的标识符是用户自己定义的。
符号常量有以下特点:
? 习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。
9
博学谷——让IT教学更简单,让IT学习更有效
? 符号常量与变量不同,符号常量的值在其作用域内不能改变,也不能再被赋值。 ? 使用符号常量的好处是:含义清楚,并且能做到“一改全改”。
2.3.2 变量的定义
在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元我们称之为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
接下来,通过一段代码来学习变量的定义,具体如下:
int x = 0, y; y = x+3;
上面的代码中,第一行代码的作用是定义了两个变量x和y,也就相当于分配了两块内存单元,在定义变量的同时为变量x分配了一个初始值0,而变量y没有分配初始值,变量x和y在内存中的状态如图2-4所示。
图2-4 x、y变量在内存中的状态
第二行代码的作用是为变量赋值,在执行第二行代码时,程序首先取出变量x的值,与3相加后,将结果赋值给变量y,此时变量x和y在内
存中的状态发生了变化,如图2-5所示。
图2-5 x、y变量在内存中的状态
从图2-4、图2-5以及上面的描述不难发现,变量实际上就是一个临时存放数据的地方。在程序中,可以将指定的数据存放到变量中,方便随时取出来再次进行使用。变量对于一段程序的运行是至关重要的,读者在后续的学习中会逐步地了解变量的作用。
2.3.3 变量的数据类型
在应用程序中,由于数据存储时所需要的容量各不相同,因此,为了区分不同的数据,需要将数据划分为不同的数据类型。C语言中的数据类型有很多种,具体如图2-6所示。
10