
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运行结果