09-操作符详解

发布时间 2023-06-25 12:05:28作者: 一步一磕头的菜鸡

@

一. 算数操作符

1. 算数操作符分类:

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

二. 移位操作符

1. 移位符分类. 注:移位操作符的操作数只能是整数, 以下对于数据以二进制码形式展示不全, 只展示了16位正确的是需要写成4个字节32位才对。

>> <<

一. 左移运算符
注意: 对于负数的左移需要在补码的基础上进行, 任何对负数的操作都是基于补码形式, 因为机器中负数就是以补码形式纯在

  1. 左移操作符规则: 左边抛弃, 右边补0;
  2. 负数左移过程详解: 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;
}

二. 右移运算符
注意: 右移运算符分为两种, 算数位移和逻辑位移. 以如下两段代码分别作为示例.

  1. 算数位移: 左边用原来的符号位填充, 右边丢弃.
  2. 逻辑位移: 左边用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详解:

  1. 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
}