关于我、重生到500年前凭借C语言改变世界科技vlog.10——进制转化&&操作符进阶

在这里插入图片描述

文章目录

  • 1.操作符分类
  • 2.进制转化
    • 2.1 二进制转十进制
    • 2.2 十进制转二进制
    • 2.3 二进制转八进制
    • 2.4 二进制转十六进制
  • 3.原码、反码、补码
  • 4.操作符进阶
    • 4.1 移位操作符
      • 4.1.2 左移操作符
      • 4.1.2 右移操作符
    • 4.2 位操作符
      • 4.2.1 &
      • 4.2.1 |
      • 4.2.2 ^
      • 4.2.3 ~
    • 4.3 结构体访问操作符
      • 4.3.1 结构体的简单介绍
      • 4.3.2 直接访问
      • 4.3.3 间接访问
  • 5.操作符的优先级,结合性
  • 6.表达式求值
    • 6.1整型提升
    • 6.2算术转化
  • 希望读者们多多三连支持
  • 小编会继续更新
  • 你们的鼓励就是我前进的动力!

操作符在写代码中有很大的作用,是用于执行特定操作的符号,主要在算术运算、比较运算、逻辑运算、位运算(用于二进制数据处理)起作用,C语言开篇已经介绍了一部分,接下来将进行一些进阶的介绍

1.操作符分类

• 算术操作符:+ 、- 、* 、/ 、%
• 移位操作符:<<、>>
• 位操作符:&、|、^
• 赋值操作符:=、+=、-=、=、/=、%=、<<=、>>=、&=、|=、^=
• 单目操作符:!、++、–、&、
、+ 、- 、~ 、sizeof、(类型)
• 关系操作符:>、>=、<、<=、==、!=
• 逻辑操作符:&&、||
• 条件操作符:?:
• 逗号表达式:,
• 下标引用:[ ]
• 函数调用:( )
结构体成员访问:. 、->

上述操作符中,除了单目操作符中的&、*将会在后续指针的vlog中介绍,高亮部分操作符是该篇要重点介绍的,操作符中有些操作符与二进制及其转化有关系,我们先拓展一些相关的基础知识

2.进制转化

计算机主流的数值表示形式为2进制、8进制、10进制、16进制
2进制中满2进1
2进制的数字每⼀位都是0~1的数字组成()

其余进制同理

12的2进制:1100
12的8进制:14
12的10进制:12
12的16进制:C
//16进制的数值之前写:0x
//8进制的数值之前写:0

进制转化都是以 2 进制为转接点,所以重点介绍 2 进制与其他进制的转换

2.1 二进制转十进制

10进制中的123,从右到左依次是个位,十位,百位
每一位都有自己的权重,每一位各自乘以各自的权重然后加和就是表示的值
在这里插入图片描述
2进制表示的10进制的12也同理
在这里插入图片描述

2.2 十进制转二进制

假设有个十进制数125转化为2进制,利用短除法可以快速得到转化后的结果

125 % 2 = 1
62 % 2 = 0
31 % 2 = 1
15 % 2 = 1
7 % 2 = 1
3 % 2 = 1
1 % 2 = 1

由下往上依次所得的余数就是125转化的2进制数,即1111101

2.3 二进制转八进制

以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算一个8进制位
剩余不够3个2进制位的直接换算
请添加图片描述
如:2进制的01101011,换成8进制:0153,0开头的数字,会被当做8进制

8 进制转 2 进制也同理,按三个三个转换,去掉转换后前面多出的 0 就是 2 进制了

2.4 二进制转十六进制

在16进制中,两位数用字母表示(大小写都可以)

10 = A/a
11 = B/b
12 = C/c
13 = D/d
14 = E/e
15 = F/f

在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进制位会换算一个16进制位
剩余不够4个2进制位的直接换算
请添加图片描述
如:2进制的01101011,换成16进制:0x6b,16进制表示的时候前面加0x

16 进制转 2 进制也同理,按四个四个转换,去掉转换后前面多出的 0 就是 2 进制了

3.原码、反码、补码

整数的2进制表示方法有三种:原码、反码、补码

我们知道 int 类型占 32 比特位,有符号整数前提下,第一位是符号位,后面三十一位是数值位
符号位用 0 表示正,1 表示负

正整数:原反补都相同
负整数:
原码:直接将数值按照正负数的形式翻译成二进制得到
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码
补码反码+1就得到补码

注意:原码取反+1即可得到补码,补码取反+1也能得到原码

计算机内存中以补码的形式保存

在补码运算中,符号位可以和数值位一起参与运算,不需要额外的判断和处理。例如,在进行加法运算时,不管是正数相加还是正数和负数相加,或者负数相加,都可以按照相同的加法规则进行运算,而不需要单独考虑符号位的处理,这种特性使得计算机在进行算术运算时更加高效和准确

4.操作符进阶

4.1 移位操作符

移位操作符分为右移操作符 >> ,左移操作符 << ,其操作数只能是整数不要移动负数位

4.1.2 左移操作符

左边抛弃,右边补0
在这里插入图片描述

4.1.2 右移操作符

逻辑右移:左边补0,右边抛弃
在这里插入图片描述
算术右移:左边用原值的符号位补充,右边抛弃
在这里插入图片描述

4.2 位操作符

位操作符的操作数必须是整数

按位与:&
按位或:|
按位异或:^
按位取反:~

以下举例a = 5,b = 3

4.2.1 &

当两个对应的二进制位都为 1 时,结果位才为 1,否则为 0

0000000000 0000000000 0000000001 01 a
0000000000 0000000000 0000000000 11 b
0000000000 0000000000 0000000000 01 a & b

4.2.1 |

当两个对应的二进制位中有一个为 1,结果位就为 1
当两个位都为 0 时,结果位才为 0

0000000000 0000000000 0000000001 01 a
0000000000 0000000000 0000000000 11 b
0000000000 0000000000 0000000001 11 a | b

4.2.2 ^

当两个对应的二进制位不同(一个为 0,另一个为 1)时,结果位为 1
当两个位相同(都为 0 或都为 1)时,结果位为 0

0000000000 0000000000 0000000001 01 a
0000000000 0000000000 0000000000 11 b
0000000000 0000000000 0000000001 10 a ^ b

4.2.3 ~

将每个二进制位中的 0 变为 1,1 变为 0

0000000000 0000000000 0000000001 01 a
0000000000 0000000000 0000000000 11 b
1111 1111 11 1111 1111 11 1111 1111 10 10 ~a
1111 1111 11 1111 1111 11 1111 1111 11 00 ~b

4.3 结构体访问操作符

4.3.1 结构体的简单介绍

结构是⼀些值的集合,这些值称为成员变量
结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚至是其他结构体

结构体的语法结构:

 struct tag
 {
 member-list;
 }variable-list;

比如想要描述一名学生:

struct Stu
 {
   char name[20];//名字
   int age;//年龄 
   char sex[5];//性别
   char id[20];//学号 
 }; //分号不能丢

结构体的定义:

struct Point
 {
   int x;
   int y;
 }p1;        //声明类型的同时定义变量p1        
struct Point p2;    //定义结构体变量p2 

结构体的初始化:

struct Point p3 = {10, 20};

 struct Stu        
{ 
  char name[15];  
  int age;   
};
 struct Stu s1 = {"zhangsan", 20};//初始化
 struct Stu s2 = {.age=20, .name="lisi"};//指定顺序初始化

4.3.2 直接访问

语法结构:结构体变量.成员名

 #include <stdio.h>
 struct Point
 {
 int x;
 int y;
 }p = {1,2};
 int main()
 {
 printf("x: %d y: %d\n", p.x, p.y);
 return 0;
 }

4.3.3 间接访问

语法结构:结构体指针->成员名

 #include <stdio.h> struct Point 
 {
 int x;
 int y; 
 };

 int main()
 {
 struct Point p = {3, 4};
 struct Point *ptr = &p;
 ptr->x = 10;
 ptr->y = 20;
 printf("x = %d y = %d\n", ptr->x, ptr->y);
 return 0;
 }

这部分如果看不太明白的话可以先了解一下后面的指针部分,再来理解代码会容易很多

5.操作符的优先级,结合性

优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执行
各种运算符的优先级是不⼀样的

如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符
是左结合,还是右结合,决定执行顺序
请添加图片描述

请添加图片描述

请添加图片描述
一般来说,可以这样记

!> 算术运算符 > 关系运算符 > 逻辑运算(&& > ||) > 赋值运算符

6.表达式求值

6.1整型提升

C语言中整型算术运算总是以普通整型进行的
为了确保每个整型都是普通类型的便于系统运算,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

保证计算精度
例如,在一个 8 位系统中,char类型的取值范围是 - 128 到 127。假设有两个char类型变量a = 120和b = 10,它们的二进制表示分别是01111000和00001010,如果直接以char类型进行相加,结果可能会溢出,因为char类型的结果可能无法正确存储130这个值。而整型提升将它们转换为int类型(通常是 32 位,有足够的空间来存储运算结果),可以避免这种溢出情况,保证运算结果的准确性

符合 CPU 运算习惯
例如,在很多现代处理器架构中,加法指令可能是针对 32 位或 64 位整数设计的。当对char或short类型进行加法运算时,将它们提升为int类型可以直接使用这些高效的指令,而不需要专门为较小的数据类型设计特殊的、可能效率较低的运算指令

提升方式:

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的
  2. 无符号整数提升,高位补0

6.2算术转化

如果某个操作符的各个操作数属于不同的类型,那么除非其中⼀个操作数的转换为另⼀个操作数的类
型,否则操作就无法进行,下面的层次体系称为寻常算术转换

 long double
 double
 float
 unsigned long int
 long int
 unsigned int
 int

如果某个操作数的类型在上面这个列表中排名靠后
那么首先要转换为另外一个操作数的类型后执行运算

希望读者们多多三连支持

小编会继续更新

你们的鼓励就是我前进的动力!

请添加图片描述

在Linux系统中,可以通过多种方式停止名为`vlog.sh`的进程。以下是一些常用的方法: 1. 使用`kill`命令: 如果你知道进程的PID(进程标识符),可以直接使用`kill`命令发送信号给该进程。例如,如果你想停止PID为1234的进程,可以使用: ```bash kill 1234 ``` 如果你不知道PID,可以先使用`ps`命令找到该进程的PID,然后再执行`kill`命令。 2. 使用`pkill`命令: `pkill`命令可以使用进程名来杀死进程。如果你想停止所有名为`vlog.sh`的进程,可以使用: ```bash pkill -f vlog.sh ``` 这里`-f`参数表示`pkill`会匹配进程的命令行信息,确保只杀死确实是你想要的`vlog.sh`脚本进程。 3. 使用`killall`命令: 另一个选项是`killall`命令,它同样可以根据进程名来杀死进程。使用方法如下: ```bash killall vlog.sh ``` 注意,这种方法会杀死所有名为`vlog.sh`的进程,所以请确保这不是系统中其他重要进程的名称。 在执行上述命令之前,请确保你有足够的权限来停止目标进程,并且理解这些命令的影响。特别是,`kill`、`pkill`和`killall`命令发送的默认信号是SIGTERM(信号15),它告诉进程优雅地终止。如果进程没有响应,你可能需要使用SIGKILL(信号9)强制终止它,但这可能会导致数据丢失或其他问题。发送SIGKILL信号的命令如下: ```bash kill -9 PID ``` 或者对于`pkill`和`killall`: ```bash pkill -9 -f vlog.sh killall -9 vlog.sh ```
评论 139
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值