C程序设计简明教程(第二版)
上QQ阅读APP看书,第一时间看更新

2.4 自主学习

2.4.1 位运算符

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。C语言提供了六种位运算符,如表2-8所示。

表2-8 六种位运算符

说明:位运算符除了“~”外,均为二元运算符。参与位运算的量只能是整型或字符型数据,不能为实型数据。

(1)按位与运算

按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0,即0&0=0;0&1=0;1&0=0;1&1=1。

(2)按位或运算

按位或运算符“|”,是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的两个二进位有一个为1时,结果位就为1,即0|0=0;0|1=1;1|0=1;1|1=1。参与运算的两个数均以补码出现。

(3)按位异或运算

按位异或运算符“∧”,是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1,即0∧0=0;0∧1=1;1∧0=1;1∧1=0。参与运算数仍以补码出现。

(4)取反运算

取反运算符“~”为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反,即0变1,1变0。

(5)左移运算

左移运算符“<<”是双目运算符。用来将一个数的各二进制位左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。

左移比乘法快得多,有些C语言编译程序自动将乘2的运算用左移一位来实现,左移n位就是乘以2n。

(6)右移运算

右移运算符“>>”是双目运算符。其功能是把“>>”左边运算数的各二进制位全部右移若干位,“>>”右边的数指定移动的位数。

应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。

2.4.2 混合运算以及数据类型转换

混合运算是指在一个表达式中参与运算的对象是不同的数据类型。

例如:

2*3.1416*r,4.5*a%5/(3*b)+'c'

如果r是int型变量,a是int型变量、b是float型变量,则以上表达式被称为“混合型表达式”,对混合类型表达式的求解要进行混合运算,此时需要对参与运算的数据进行类型转换。

变量的数据类型转换有两种方法:自动转换和强制转换。

(1)自动转换

自动转换发生在不同数据类型的混合运算时,由编译系统自动完成。

【例2.13】求圆的面积。

程序代码如下:

运行结果如图2-15所示。

图2-15 例2.13运行结果

说明:本例程序中,PI为float类型,s和r为整型。在执行s=PI*r*r语句时,PI和r都要转换成double类型计算,结果为double类型。但由于s为整型,故赋值结果为整型,舍掉了小数部分。

(2)强制类型转换

强制类型转换是通过类型转换运算来实现的。

其一般形式为:

(类型说明符)(表达式)

其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如:

(float)a  //计算的结果是把a的值转换为实型

(int)(x+y)  //计算的结果是把x+y的结果转换为整型

在使用强制类型转换时应注意以下问题:

①类型说明符和表达式都必须加括号(单个变量可以不加括号)。

②无论是强制转换还是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。

【例2.14】类型转换的应用。

说明:a被强制转换为int类型,但只是在运算中起作用,是临时性的,而a本身的类型并没有因此而发生变化。因此,(int)a的值是3(舍去小数部分),而a的值仍是3.75。

运行结果如图2-16所示。

图2-16 例2.14运行结果