09-操作符详解
一. 算数操作符
1. 算数操作符分类:  
| + | - | * | / | % | 
|---|
- 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
- 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
- % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
二. 移位操作符
1. 移位符分类. 注:移位操作符的操作数只能是整数, 以下对于数据以二进制码形式展示不全, 只展示了16位正确的是需要写成4个字节32位才对。
| >> | << | 
|---|
一. 左移运算符
注意: 对于负数的左移需要在补码的基础上进行, 任何对负数的操作都是基于补码形式, 因为机器中负数就是以补码形式纯在
- 左移操作符规则: 左边抛弃, 右边补0;
- 负数左移过程详解: 1000000000000101(源码) -> 1111111111111010(反码) -> 1111111111111011(补码) -> 1111111111101100(补码左移两位) -> 1111111111101011(左移两位的反码) -> 1000000000010100(左移两位的源码) = -20
#include <stdio.h>
int main()
{
	int a = 5;        // 0000000000000101
	int b = -5;       // 1000000000000101
	int x = a << 2;   // 20
	int y = a << 2;   // -20
	printf("%d \n", x);
	printf("%d \n", y);
	return 0;
}
/*
	证明负数在左移的时候, 左值是直接丢弃的. 11000000000000000000000000000000(源码) ->
	10111111111111111111111111111111(反码) -> 11000000000000000000000000000000(补码) -> 
	00000000000000000000000000000000(左移两位,, 注意之里左移两位后变成了0, 所以这里的补码也就
	是源码所以结果输出为0)
*/
#include <stdio.h>
int main()
{
	int a = -1073741823;        // 11000000000000000000000000000000
	
	int x = a << 2;   // 0
	printf("%d \n", x);
	
	return 0;
}
二. 右移运算符
注意: 右移运算符分为两种, 算数位移和逻辑位移. 以如下两段代码分别作为示例.
- 算数位移: 左边用原来的符号位填充, 右边丢弃.
- 逻辑位移: 左边用0填充, 右边丢弃
//算数位移
#include <stdio.h>
int main() {
   int x = -5;
   int y = x >> 2;    // -2
   printf("%d\n", y);
   return 0;
}
//逻辑位移
#include <stdio.h>
int main() {
   unsigned int x = -5;
   unsigned int y = x >> 2;  //1073741822
   printf("%u\n", y); 
   return 0;
}
三. 位操作符
1. 位操作符分类:
| & | | | ^ | 
|---|
//面试题案例: 不能创建临时变量(第三个变量),实现两个数的交换。
#include <stdio.h>
int main()
{	
 	int a = 10;
 	int b = 20;
 	//function One;
 	a = a + b;
 	b = a - b;
 	a = a - b;
 	//function Two;
 	a = a^b;
 	b = a^b;
	a = a^b;
 	printf("a = %d b = %d\n", a, b);
 	return 0;
}
四. 赋值操作符
 1. 基本赋值符
= 是基本的赋值操作符
2. 复合赋值符
| += | -= | *= | /= | %= | >>= | <<= | &= | |= | ^= | 
|---|
五. 单目操作符
1. 单目操作符分类
| ! | - | + | & | sizeof | ~ | -- | ++ | * | (类型) | 
|---|---|---|---|---|---|---|---|---|---|
| 逻辑反 | 负值 | 正值 | 取地址 | 操作数的类型长度 | 按位取反 | 前后置-- | 前后置++ | 解引用 | 强制类型转换 | 
sizeof详解:
- sizeof计算表达式大小的时候在编译期间, 所以sizeof()中的表达式不参与运算.
#include <stdio.h>
int main()
{
	short s = 5;
	int a = 10;
	printf("%d \n", sizeof(s = a + 2));  // 2
	printf("%d \n", s);					 // 5
}
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号