chapter 15 运算符详解
15.1位运算符
1.位运算符都是要做Usual Arithmetic Conversion(其中有一步是Integer Promotion),所以在c语言中并不存在8为整数的位运算,操作数在进行运算前都至少被提升为int型了
ex1:
unsigned char c = 0xfc; unsigned int i = ~c;
因为在~c前已经先将c转换为16位,所以为0x00fc.取反,如果理解为8位,则为0xfc取反,此时错误的结果为3.
2.在一定的取值范围内,将一个整数左移1位相当于乘以2.此时一定的范围主要是指,左移不能改变最高位(符号位)
3右移的规则
- 如果是正数,最高位移入0
- 如果为负数,最高位移入0or1(根据不同平台确定,Implementation-defined,gcc为1)
tip:一般建议仅对无符号数进行操作,以减少出错的可能。
4 异或的性质:不管0or1,与0异或保持原值不变,与1异或则取反
利用此性质可以进行就校验:a1^a2^a3…..^an 如果结果为1,则其中的1的个数为奇数个,否则为偶数个
5RAID(redundant array of independent disks)独立磁盘冗余阵列就是利用为操作的原理进行分割
不用变量交换两数据
1
startAngle = startAngle+stopAngle;
stopAngle = startAngle-stopAngle;
startAngle = startAngle-stopAngle;
缺点:无法用于小数
2
x ^= y;
y ^= x;
x ^= y;
缺点:无法用于小数
(不要用这种方法,最好的还是利用temp进行交换)
5 sizeof 表达式 其中表达式并不求值。sizeof(i++),其中i不变
6 side effect &sequence point
side effect:改变计算机存储的值或者输入输出
sequence point:当执行到某一点时,之前的side effect必须作用完毕
在写代码时要
熬注意同一个变量在两个sequence point之间最多只允许改变一次
ex2
int a =0;
a = a++;
ex3
a[i++]=i;
虽然只改变一次也是不确定的
C99 Between the previous and next sequence point an object shall have its stored value modified at most once by the
evaluation of an expression.Furthermore,the prior value shall be read only to determine the value to be stored.