操作符

算术运算符

+		-		*		/		%	
  1. 除%外,其余操作符均可用于整数和浮点数。
  2. /操作符如果两个操作符都为整数,执行整数除法。/两边只要有浮点数执行的就是浮点数操作。
  3. %操作符的两个操作符必须为整数,返回的是整除后1余数。

移位操作符

<<	左移操作符
>>	右移操作符
左移操作符规则

左边抛弃右边补0

右移操作符规则

右移运算符分为两种:

  1. 逻辑移位:左边用0填充,右边丢弃
  2. 算术移位:左边用原该值的符号为填充,右边丢弃
  3. 对于移位操作,不要移动负数位,这个是标准未定义的。
int num=10;
num>>-1;//错误
  1. 计算机存储数字均是它的补码。
    左移和右移一般相对于无符号数运算。
位操作符
&		//按位与
|		//按位或
^		//按位异或

注:他们的操作符必须是整数。

赋值操作符
=
复合赋值操作符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
单目操作符
!				逻辑反操作
-				负值
&				正值
sizeof		操作数的类型长度(以字节为单位)
~				对一个数的二进制按位取反
--				前置,后置--
++			前置,后置++
*				间接访问操作符(解引用操作符)			
(类型) 强制类型转换
关系操作符
>
>=
<
<=
!=		用于测试不相等
==		用于测试相等
逻辑操作符
&&		逻辑与
||			逻辑或
条件操作符

exp1 ? exp2 : exp3

逗号表达式
exp1,exp2,exp3,......expN

逗号表达式,就是用逗号隔开的多个表达式。逗号表达式,从左到右依次执行,整个表达式的结果是最后䘝表达式的结果。

表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样有些表达式在求值的过程中需要转换为其他类型。

隐式类型转换
  1. C的整型算术运算总是至少以缺省类型的精度来进行的。
  2. 为了获取这个精度,表达式中的字符和短整型操作数在使用之前转化为普通类型,这种类型称为整型提升

整型提升的意义:
表达式的整型运算要在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)系统中除了整型运算,其他运算符也可能发生整型提升。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值