文章目录
- 一、操作符的分类
- 二、算术操作符
- 三、 二进制和进制转换
- 四、原码、反码、补码
- 五、移位操作符
- 5.1左移操作符
- 5.2 右移操作符
一、操作符的分类
操作符可以分为:
1.算术操作符:+、-、、/、%
2.移位操作符:<<、>>
3.位操作符:&、|、^
4.逻辑操作符:&&、||
5.赋值操作符:+=、-=、=、/=、%=、>>=、<<=、&=、|=、^=
6.单目操作符:++、–、sizeof、+、-、*、!、~、&、(类型)
7.条件操作符:?、:
8.下标引用操作符:[ ]
9.结构体访问操作符: . 、->
10.函数调用操作符:( )
11.逗号表达式:,
12.关系操作符:<、>、==、!=、<=、>=
二、算术操作符
算术操作符通常是用来进行算术运算的
比如:
inta=0;a=4+4*3//先计算乘法,再计算加法a=(4+4)*3//可以通过括号,改变运算的顺序需要注意的是,要给一个变量赋值是采用a=b+c的形式,要被赋值的变量在左边,要赋给变量的值在右边,这与数学的a+b=c不同
二、移位操作符
在认识移位操作符之前,我们需要先了解一下二进制
三、 二进制和进制转换
二进制。八进制、十进制、十六进制其实就是数值的不同表达形式而已
比如:15的各进制表达形式:
二进制:1111
八进制:1 7
十进制:15
十六进制:F
十进制,其实是我们生活中见得最多的,我们已经形成了许多常识
10进制中满10进一 十进制的每一位数都是由0~9的数字组成 其实在二进制中,也是一样的 在二进制中,满2进1 二进制的每一位数都是由0~1的数字构成的那么,15的二进制数为什么是1111呢?
其实,不管是二进制、八进制、十进制,还是十六进制,每一位都是有权重的,就比如,十进制的权重从右往左依次是:1 0 0 , 1 0 1 , 1 0 2 . . . . . . 10^0,10^1, 10 ^ 2......100,101,102......
15他的十进制的由来其实就是5 ∗ 1 0 0 + 1 ∗ 1 0 1 = 15 5*10^0+1*10^1 = 155∗100+1∗101=15
第一位(个位)的权重就是1 0 0 10^0100,第二位的权重就是1 0 1 10 ^ 1101…第n位的权重就是10的(n-1)次方
十进制的值就是对应位的值✖对应位的权重,最后再相加,就是十进制的值
二进制和十进制都是类似的,只不过二进制的权重,从右往左,依次是2 0 、 2 1 、 2 2 2^ 0、2^1、2^220、21、22… 2 的(n-1)次方
知道了二进制如何转十进制,那么十进制怎么转二进制呢?
其实,很简单,采用连除的方法就可以了
所以,十进制的20转换为二进制后的结果就是10100
同样的,十进制转换为其他进制时,也采用连除的方法,把2替换成要转换的进制即可
需要注意的是:
在十六进制中,10 ~ 15是使用A ~ F来表示的,如果按照10~15来表示的话,就容易出现分不清到底是几位十六进制数的情况
比如:1110是四位十六进制呢?还是三位呢?又或者是两位呢?
所以,为了避免这样的情况发生,就统一的把十六进制中10 ~ 15用A~F来表示
接下来就是二进制转八进制、十六进制的方法
二进制想要转八进制,采用分组的办法,依次从右往左,每三位二进制位就是一位八进制,因为八进制的每一位数的取值范围是0~7,而三位二进制正好对应八进制的每一位最大能取得值,所以三位二进制就足够表示一位八进制
例如:
同样的,二进制转十六进制也是采用分组的方法,不同的是,二进制转十六进制是依次从右往左,每四位二进制位为一位十六进制位
四、原码、反码、补码
整数的二进制表示方法有三种,即原码、反码、补码
有符号的整数的二进制最高位是符号位,其余的是数值位
符号位为0表示正,符号位为1表示负
例如:
正数的原码、反码、补码相同
负数的原码、反码、补码的表示方法各不相同
原码:按照正负数的形式直接转换为二进制数就是原码
反码:符号位不变,其他位按位取反,也就是0变成1,1变成0
补码:取反+1
6 的原码反码补码: 00000000000000000000000000000110 -6 的原码: 10000000000000000000000000000110 反码: 11111111111111111111111111111001 补码: 11111111111111111111111111111010补码得到原码也可以使用取反+1
无符号数的三种二进制表示方法相同,没有符号位,每一位都是数值位
对于整型来说,数据存放在内存里的其实就是补码
五、移位操作符
移位操作符分为:
左移操作符<<
右移操作符>>
需要注意的是:移位操作符的操作数只能是正数
5.1左移操作符
移位规则:左边抛弃,右边补0
例如:
#include<stdio.h>intmain(){inta=10;a<<=1;//a = a<<1printf("%d",a);return0;}运行结果:
画图理解一下
5.2 右移操作符
右移操作符又分为:
逻辑右移:左边用0填充,右边丢弃
算术右移:左边用原该值的符号位填充,右边丢弃
例如:
intmain(){inta=-6;intnum=0;num=a>>1;printf("%d",num);return0;}运行结果:
显然,在VS2022中使用的是算术右移
算术右移画图表示:
逻辑右移画图表示:
警告:对于移位操作符,不要移动负数位,这个是标准未定义的