算术运算符
+ - * / %
- 除%外,其余操作符均可用于整数和浮点数。
- /操作符如果两个操作符都为整数,执行整数除法。/两边只要有浮点数执行的就是浮点数操作。
- %操作符的两个操作符必须为整数,返回的是整除后1余数。
移位操作符
<< 左移操作符
>> 右移操作符
左移操作符规则
左边抛弃右边补0
右移操作符规则
右移运算符分为两种:
- 逻辑移位:左边用0填充,右边丢弃
- 算术移位:左边用原该值的符号为填充,右边丢弃
注
- 对于移位操作,不要移动负数位,这个是标准未定义的。
int num=10;
num>>-1;//错误
- 计算机存储数字均是它的补码。
左移和右移一般相对于无符号数运算。
位操作符
& //按位与
| //按位或
^ //按位异或
注:
他们的操作符必须是整数。
赋值操作符
=
复合赋值操作符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
单目操作符
! 逻辑反操作
- 负值
& 正值
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置,后置--
++ 前置,后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符
>
>=
<
<=
!= 用于测试不相等
== 用于测试相等
逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
exp1 ? exp2 : exp3
逗号表达式
exp1,exp2,exp3,......expN
逗号表达式,就是用逗号隔开的多个表达式。逗号表达式,从左到右依次执行,整个表达式的结果是最后䘝表达式的结果。
表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样有些表达式在求值的过程中需要转换为其他类型。
隐式类型转换
- C的整型算术运算总是至少以缺省类型的精度来进行的。
- 为了获取这个精度,表达式中的字符和短整型操作数在使用之前转化为普通类型,这种类型称为整型提升。
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长
度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算
整型提升举例
整型提升是按照变量的数据类型的符号位来提升的。
//负数的整型提升
char c1=-1;
变量c1的二进制(补码)中只有8个比特位
因为char为有符号的char
所以整型提升的时候,高位补充符号位,即为1。
提升之后的结果
1111 1111 1111 1111 1111 1111 1111 1111
//正数的整形提升
char c2=1;
变量c2的二进制位(补码)中只有8个比特位:00000001
因为char为有符号的char
所以整型提升的时候,高位补充符号位,即为0
提升之后的结果是:
0000 0000 0000 0000 0000 0000 0000 0001
//无符号整型提升高位补0
//实例1
int main()
{
char a=0xb6; //1011 0110
short b=0xb600;1011 0110 0000 0000
int c=0xb6000000; //1011 0110 0000 0000
if(a==0xb6) //提升a=1111 1111 1011 0110
printf("a");
if(b==0xb600) //提升b=1111 1111 1011 0110 0000 0000
printf("b");
if(c==0xb6000000)
printf("c");
return 0;
}
//实例2
int main()
{
char c=1;
printf("%u\n",sizeof(c));
printf("%u\n",sizeof(+c));//整形提升4个字节
printf("%u\n",sizeof(!c));//整型提升4个字节
}
总结
1.int x=10;
x>>1/x+1 //这种操作不会改变x的值,必须赋值 x=x+1/x=x>>1
3.交换的三种方法:
临时变量
加减法/乘除法
异或
4.求二进制的1的个数
x&(1<<32):移动32次 无符号数
x&(x-1):相与的次数是1个数 有符号数和无符号数
5.赋值 左=右 左值空间右值内容
6.sizeof不是函数
7.–a/++a一般效率高,前置一般效率高于后置(细节中的小问题,不太深究)
8.强制类型转化:不改变内容只改变类型
转化:改变底层的数据(比如:高字节数类型的内容存到低字节类型,则就要把高字节类型内容转化成低字节类型范围能够存储的值 string s=“1234567”; int a=(int)s不可用s是8个字节,无法强转到4个字节)
9.C的整型算术运算(+,-,*,/,%)总是至少以缺省整型类型的精度来进行的。
cpu从内存中读取到寄存器中是以4个字节存取(32位计算机)
10.整型提升(表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型
提升)是按照变量(变量自身,不看最后的打印类型)的数据类型的符号位提升
11.在其他(不在Windows)系统中除了整型运算,其他运算符也可能发生整型提升。