c语言中的各种运算操作

298 阅读2分钟

这是我参与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)

移位运算:

  1. 提取部分信息
  2. 扩大或缩小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)

    带符号数:符号扩展(前面补符)

截断:长转短

    强行将高位丢弃,可能发生溢出
   

Image.png

Image.png