操作符详解
1.操作符的分类
2.二进制和进制转化
八进制表示:开头加0
十六进制表示:开头加0x
3.原码,反码,补码
整数的2进制表示方法有三种,即原码、反码和补码
有符号整数的三种表示⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号位,剩余的都是数值位。符号位都是用0表示“正”,⽤1表示“负”,无符号整数全为数值位
补码取反加一得到原码
对于整型来说,数据以补码的形式存放在内存中
(在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时加法和减法也可以统一处理(CPU只有加法器),此外,补码和源码相互转换,其运算过程是相同的,不需要额外的硬件电路)
4.移位操作符
移位操作符的操作数只能是正整数
(1)左移操作符<<
规则:左边抛弃,右边补零
(2)右移操作符>>
右移运算分两种:
逻辑右移(右边抛弃,左边补零)
算数右移(左边用原来的符号位填充,右边抛弃)
采用哪种右移取决于编译器,但是大部分编译器采用算数右移
5.位操作符
位操作符有:(补码)
&(按位与):有0则为0,没0才为1
|(按位或):有1则为1,没1才为0
^(按位异或 ):相同为0,相异为1
~(按位取反):取反
这些操作符的操作数必须是整数
6.举例
(1)不能创建临时变量(第三个变量),实现两个整数的交换
抓住规律:任何一个数异或0就是它本身,异或它本身就是0
(2)求一个整数储存在内存中的二进制中1的个数
以上这种写法只能用于正整数
优化后可以用于正整数和负整数,但要循环32次,效率不高
以上代码效率更高:
·在n=n&(n-1)中,当n末位是1时,-1后为0,结果末位必是0,则必少一个1;当n末位是0时,n-1打乱了末位前的分布,必出现错位,有错位必出0,则必少一个1;总体结果是靠右的1依次消失
·想得到某个二进制序列的最后一位,就给它按位与个1
(3)二进制位置0或置1
将13的二进制序列的第五位修改为1,然后再改为0
6.逗号表达式
逗号表达式就是用逗号隔开的多个表达式,从左到右依次执行,整个表达式的结果是最后一个表达式的结果
7.下标访问[] 函数调用()
(1)下标访问操作符[ ] 的操作数是一个数组名和一个索引值(下标)
(2)函数调用操作符( ) 接受一个或者多个操作数,第一个操作数是函数名,剩余的操作数就是传递给函数的参数
8.结构成员访问操作符
(1)结构体是自定义的数据类型,结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量,如:标量,数组,指针,甚至是其他结构体
(2)
结构的声明
结构体变量的定义
或
结构体变量的初始化
指定顺序初始化
结构体嵌套初始化
(3)结构体成员的直接访问用 .操作符,.操作符接受两个操作数