操作符分类
• 算术操作符: + 、- 、* 、/ 、%
• 移位操作符: << >>
• 位操作符: & | ^ `
• 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
• 单⽬操作符: !、++、--、&、*、+、-、~ 、sizeof、(类型)
• 关系操作符: > 、>= 、< 、<= 、 == 、 !=
• 逻辑操作符: && 、||
• 条件操作符: ? :
• 逗号表达式: ,
• 下标引⽤: []
• 函数调⽤: ()
进制之间的转换
二进制转十进制相信大家已经会了,包括十进制转化成二进制。
那二进制转化成其他进制又应该怎么算呢:
以二进制转化成八进制为例子,首先把0到7的数字转化成二进制,发现最多有三个二进制位就够了,比如7的二进制位是111,如果我们把01101011转化成八进制,从右边向左边;
0 1 | 101 | 011 |
1 | 5 | 3 |
二进制转十六进制:
0到9,a到f各写成二进制,如01101011
0110 | 1011 |
6 | b |
十六进制需要在前面加上0x,这个时候就0x6b
移位操作符
<< 左移操作符
>> 右移操作符
左移操作符:
规则;左边抛弃,右边补0;
#include<stdio.h> int main() { int num =10; int n = num << 1; printf("num=%d\nn=%d\n", num, n); return 0; }
出现这样的结果就是在二进制的情况下,左边抛弃了一位,右边补了一个0;
右移操作符
1.逻辑右移:左边用0补充,右边丢弃
2.算术右移:左边用原该值填充,右边丢弃
在不同的编译器上,使用的情况不一样。
左移操作符向左移动一位相当于乘上一个2 ^ 1,左移两位就相当于乘上一个2 ^ 2。而右移操作符右移一位相当于除上一个2 ^ 1。
位操作符
& 按位与
| 按位或
^ 按位异或
~ 按位取反
注意;操作数必须是整数
#include<stdio.h> int main() { int num1 = -3; int num2 = 5; printf("%d\n", num1 & num2); printf("%d\n", num1 | num2); printf("%d\n", num1 ^ num2); printf("%d\n", ~0); return 0; }
& 按位与
运算符 “ & ” :把参见运算两个数所对应的二进制位分别进行“与”运算,即:两位同为“1”,结果才为“1”
| 按位或
运算符 “ | ” :把参见运算两个数所对应的二进制位分别进行“或”运算,即:两位同为“0”,结果才为“0”,否则为1
^ 按位异或
按位异或运算规则为:把参见运算两个数所对应的二进制位分别进行“异或”运算,相同为0,相异为1
~ 按位取反
~ 按位取反:把目标的二进制位按位取反,即:使得每一位上的0变成1,1变成0
单目操作符
! ++ -- & * sizeof等
结构成员访问操作符
结构是一些值的集合,这些值称为成员变量。
struct stu { char name[20]; int age; char sex; }
整型提升
C语言中,整型算术运算总是以缺省整型的精度来运算的,所以为了获得这个精度,表达式中字符和短整型操作数在使用之前会被转化成普通整型
如何进行整型提升
1.有符号 整数提升是按照变量的数据类型来提升的
2. 无符号整数提升,高位补0;