操作符补充:
-
算术操作符
-
/除:
int a = 6/5; //1 double a = 6/5; //1 double a = 6.0/5; //1.0
-
% 取模
int a = 2%5; //2,取模操作符两端必须是整型
-
-
左/右移操作符
>>:右移:
- 算术右移:右边丢弃,左边补原符号位
- 逻辑右移:右边丢弃,左边补0;
-
与、或、异或 操作符
-
& 与:全1才1,有0则0
-
| 或:有1则1,全0才0
-
^ 异或:相同为0,相异为1
//在不多加变量的情况下,交换a和b的值,a=3;b=5; int main(){ int a = 3; int b = 5; printf("a=%d b=%d\n",a,b); //a=3,b=5 //利用异或操作符对a,b的二进制码进行操作 a = a^b; b = a^b; a = a^b; printf("a=%d b=%d\n",a,b); //a=5,b=3 return 0; }
-
-
sizeof操作符
sizeof():sizeof括号内的操作,不参与运算
-
~按位取反
~按位取反包括符号位
-
逻辑操作符
int a=0,b=2,c=3,d=4; i=a++&&++b&&d++; //当i=a++时,a=0,(由于是&&操作符,已经有不对的了)因此后面就不会再继续操作了,因此这句代码就只执行了a++ printf("%d %d %d %d",a,b,c,d); //1 2 3 4 int a=1,b=2,c=3,d=4; i=a++||++b||d++; //当i=a++时,a=1,(由于是||操作符,已经有对的了)因此后面就不会再继续操作了,因此这句代码就只执行了a++ printf("%d %d %d %d",a,b,c,d); //2 2 3 4
-
整型提升
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。-
有符号的整型提升:高位补符号位
-
无符号的整型提升:高位补0
char a = 3; //3的二进制码:00000000 0000000 00000000 00000011 //a中存储的:00000011 char b = 127; //127的二进制码:00000000 0000000 00000000 01111111 //b中存储的:01111111 char c = a+b; //在执行运算时需要将char类型转化为int类型,需要分别高位补齐,又由于是char类型(有符号),因此高位补符号位 //a:00000000 0000000 00000000 00000011 //b:00000000 0000000 00000000 01111111 //c:00000000 0000000 00000000 10000010 //在用char类型接受,需要高位阶段; c:10000010 printf("%d",c); //由于打印时用的%d,因此需要将char类型再转化为int类型 //同理高位补齐;c(补码):11111111 11111111 11111111 10000010 //再利用补码->反码->原码; //反码:11111111 11111111 11111111 10000001 //原码:10000000 00000000 00000000 01111110 符号位不变 //打印-126
-
-
操作符的属性:
-
操作符的优先级
-
操作符的结合性
-
是否控制操作顺序
-