这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
c语言中的各种运算操作
赋值运算
复合赋值运算符包括*= ,/=, %=, +=, -=, <<=, >>=, &=, ^=, |=,在赋值的同时做一个运算。
例如a += 1相当于a = a + 1。但有一点细微的区别,前者对表达式a只求值一次,而后者求值两次,如果a是一个复杂的表达式,求值一次和求值两次的效率是不同的,例如a[i+j] += 1和a[i+j] = a[i+j] + 1。
对于没有Side Effect的表达式,求值一次和求值两次的结果是一样的,但对于有Side Effect的表达式则不一定,例如a[foo()] += 1和a[foo()] = a[foo()] + 1,如果foo()函数调用有SideEffect,比如会打印一条消息,那么前者只打印一次,而后者打印两次。
按位运算
按位与,按位或,按位取反,按位异或
“|““&”“~”“^”
析取操作:
从数据y中提取低位字节,并使高字节为0:
可用&实现“掩码”操作:y & 0x00FF(y=0x0B2C时,得到结果0x002C)
移位运算:
- 提取部分信息
- 扩大或缩小2的n次倍
左移:x<<k;
右移:x>>k
移位类型由x的类型确定:
x为无符号,为逻辑移位;
高(低)移出,低(高)补零,可能溢出。
溢出:在最高位移出的是1时,左移发生溢出
x为带符号,为算术移位;
左移:高位移出,低位补零。可能溢出
溢出:若移出的位不等于新的符号为,则溢出
右移:低位移出,高位补符号位,可能有效数据丢失。
移位运算和按位运算举例
n(n>=8)位的变量x
1.x的最高有效字节不变,其余各位全变为0.
(x>>(n-8))<<(n-8)
2.x的最低有效字节不变,其余全为0.
x&0xFF
3.x的最低有效字节全为0,其余取反
((x^~0xFF)>>8)<<8
4.x最低有效字节为1,其余各位不变
x|0xFF
逻辑运算
关系表达式的运算
||——OR
&&——AND
!——NOT
与按位运算的差别
符号表示不同
运算过程不同:按位运算->按位——逻辑运算->整体
结果类型不同:按位运算->位串——逻辑运算->逻辑值
位扩展和位截断运算
扩展:短转长
无符号数:0扩展(前面补0)
带符号数:符号扩展(前面补符)
截断:长转短
强行将高位丢弃,可能发生溢出