C语言 —— 愿此世如黄金般辉煌 - 进制转换与操作符详解

目录

1. 操作符的分类

2. ⼆进制和进制转换

2.1 2进制转10进制

2.2 10进制转2进制

2.3 2进制转8进制

2.4 2进制转16进制

3. 原码、反码、补码

4. 移位操作符

4.1 左移操作符

4.2 右移操作符

5. 位操作符:&、|、^、~

5.1 & 按位与

 5.2 |  按位或

5.3 ^  按位异或

5.4 ~  按位取反

6. 结构成员访问操作符

 6.1 什么是结构体

6.2 结构体成员的直接访问

6.3 结构体成员的间接访问

7. 操作符的属性:优先级与结合性

7.1 优先级

7.2 结合性


1. 操作符的分类

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

 


 

2. ⼆进制和进制转换
 

其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?其实2进制、8进制、10进制、16进制是数值的不同表⽰形式⽽已

二进制:

  

2进制中满2进1,2进制的数字每⼀位都是0~1的数字组成:
   

128  64  32  16  8  4  2  1

  

十进制12的二进制就是1100,也就是取上面8 4 2 1的前两位

2.1 2进制转10进制

10进制中的123,从右到左依次是个位,十位,百位,每一位都有自己的权重,每一位各自乘以各自的权重然后加和就是表示的值

2进制转换10进制的12也相同

2.2 10进制转2进制

2.3 2进制转8进制

8进制的数字每⼀位是0~7的,0~7的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,⽐如7的⼆进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀个8进制位,剩余不够3个2进制位的直接换算

如:2进制的01101011,换成8进制:0153,0开头的数字,会被当做8进制

2.4 2进制转16进制

16进制的数字每⼀位是0~9,a ~f 的,0~9,a ~f的数字,各⾃写成2进制,最多有4个2进制位就⾜够了,⽐如 f 的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算

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

  

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

如:2进制的01101011,换成16进制:0x6b,16进制表⽰的时候前⾯加0x


3. 原码、反码、补码

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

   
有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号位,剩余的都是数值位

   
符号位都是⽤0表⽰“正”,⽤1表⽰“负”

正整数的原、反、补码都相同

负整数的三种表示方法各不相同

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

    
反码得到原码也是可以使用:取反,+1的操作

  

数据存放内存中其实存放的是补码


4. 移位操作符

移位操作符的操作数只能是整数,移动操作符移动的是二进制位

4.1 左移操作符

 移位规则:左边抛弃、右边补0,左移的效果和乘2类似

#include <stdio.h>

int main()
{
	int num = 10;
	int n = num << 1;

	printf("n= %d\n", n);
	printf("num= %d\n", num);

	return 0;
}


4.2 右移操作符

与左移操作符的效果相反,右移的效果和除2类似

   

移位规则:右移运算分两种:

   
1. 逻辑右移:左边⽤0填充,右边丢弃

   

   
2. 算术右移:左边用原该值的符号位填充,右边丢弃

   

  

    

   

#include <stdio.h>

int main()
{
	int num = 10;
	int n = num >> 1;

	printf("n= %d\n", n);
	printf("num= %d\n", num);

	return 0;
}

   

对于移位运算符,不要移动负数位,这个是标准未定义的

   

例如:

   

int num = 10;
num>>-1;

 


5. 位操作符:&、|、^、~

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

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

5.1 & 按位与

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

0000000000 0000000000 0000000001 11 a
0000000000 0000000000 0000011000 11 b

0000000000 0000000000 0000000000 11 a & b

 5.2 |  按位或

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

  

也就是有1为1,无1为0

0000000000 0000000000 0000000001 01 a
0000000000 0000000000 0000000000 11 b

0000000000 0000000000 0000000001 11 a | b

5.3 ^  按位异或

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

   

也就是不同为1,相同为0

0000000000 0000000000 0000000001 01 a
0000000000 0000000000 0000000000 11 b

0000000000 0000000000 0000000001 10 a ^ b

5.4 ~  按位取反

顾名思义,将每个二进制位中的 0 变为 1,1 变为 0

0000000000 0000000000 0000000001 01 a

1111 1111 11 1111 1111 11 1111 1111 10 10 ~a


6. 结构成员访问操作符

   

 6.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" };//指定顺序初始化

结构体嵌套初始化:

struct Node
{
	int data;
	struct Point p;
	struct Node* next;

}n1 = { 10, {4,5}, NULL };

//结构体嵌套初始化
struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化


6.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;
}

 

6.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;
}


7. 操作符的属性:优先级与结合性

优先级与结合性决定了表达式求值的计算顺序

7.1 优先级

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

  

举个例子:1 3 + 4 * 5;

  

上⾯⽰例中,表达式 3 + 4 * 5 ⾥⾯既有加法运算符( + ),⼜有乘法运算符( * )。由于乘法的优先级⾼于加法,所以会先计算 4 * 5 ,⽽不是先计算 3 + 4 

7.2 结合性

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

    

⼤部分运算符是左结合(从左到右执⾏),少数运算符是右结合(从右到左执⾏),⽐如赋值运算符( = )

一般来说:!> 算术运算符 > 关系运算符 > 逻辑运算(&& > ||) > 赋值运算符 

优先级链接:

  

C 运算符优先级 - cppreference.comhttps://zh.cppreference.com/w/c/language/operator_precedence 


如宝石般璀璨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983444.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VsCode导入时选择相对路径

自动导入时总是以db://开头了&#xff0c;而我们通常需要的是相对路径&#xff0c;对VsCode进行如下设置&#xff1a; 打开 VSCode 设置&#xff1a; 使用快捷键 Ctrl ,&#xff08;Windows/Linux&#xff09;或 Cmd ,&#xff08;Mac&#xff09;。 或者在菜单栏中选择 …

Python3 爬虫 爬虫中间件

爬虫中间件的用法与下载器中间件非常相似&#xff0c;只是它们的作用对象不同。下载器中间件的作用对象是请求request和返回response&#xff1b;爬虫中间键的作用对象是爬虫&#xff0c;更具体地来说&#xff0c;就是写在spiders文件夹下面的各个文件。它们的关系&#xff0c;…

数据库1-2章

第一章 数据库理论 什么是数据库 数据&#xff1a; 描述事物的符号记录&#xff0c; 可以是数字、 文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;它们都可以经过数字化后存入计算机。 数据库&#xff1a; 存储数据的仓库&#xff0c;是长期存放在…

Linux笔记---自定义shell

目录 前言 1. 程序框架 2. 打印命令行提示符 2.1 获取用户名(GetUserName) 2.2 获取主机名(GetHostName) 2.3 获取工作目录(GetPwd) 3. 获取命令行输入 4. 判断是否有重定向 5. 解析命令行 6. 内建命令 6.1 内建命令的特点 6.2 常见内建命令 6.3 内建命令 vs 外部命…

DeepSeek专题:DeepSeek-V2核心知识点速览

AIGCmagic社区知识星球是国内首个以AIGC全栈技术与商业变现为主线的学习交流平台&#xff0c;涉及AI绘画、AI视频、大模型、AI多模态、数字人以及全行业AIGC赋能等100应用方向。星球内部包含海量学习资源、专业问答、前沿资讯、内推招聘、AI课程、AIGC模型、AIGC数据集和源码等…

游戏引擎学习第138天

仓库:https://gitee.com/mrxiao_com/2d_game_3 资产&#xff1a;game_hero_test_assets_003.zip 发布 我们的目标是展示游戏运行时的完整过程&#xff0c;从像素渲染到不使用GPU的方式&#xff0c;我们自己编写了渲染器并完成了所有的工作。今天我们开始了一些新的内容&#…

【Hadoop】详解HDFS

Hadoop 分布式文件系统(HDFS)被设计成适合运行在通用硬件上的分布式文件系统&#xff0c;它是一个高度容错性的系统&#xff0c;适合部署在廉价的机器上&#xff0c;能够提供高吞吐量的数据访问&#xff0c;非常适合大规模数据集上的应用。为了做到可靠性&#xff0c;HDFS创建了…

计算机网络:计算机网络的概念

1.计算机网络&#xff1a;由若干个结点和链接这些的链路组成。 2.集线器&#xff08;Hub&#xff09;&#xff1a;可以把多个结点连接起来&#xff0c;组成一个计算机网络。 不能避免数据冲突的情况 3.交换机&#xff08;Switch&#xff09;:可以把多个结点连接起来&#x…

C/C++类型转换

目录 C语言中的类型转换 隐式类型转换&#xff1a; 显示类型转换&#xff1a; 总结&#xff1a; C中的类型转换 static_cast: reinterpret_cast: const_cast: dynamic_cast: RTTI C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参…

发行基础:宣传片

转载自官方文件 --------------- 宣传片 概览 作为 Steam 发行流程的一部分&#xff0c;您需要上传自己产品的宣传片。 宣传片将会显示在您的产品商店页的顶端&#xff0c;通常是您的潜在客户第一眼会看见的内容。 最佳实践 在 Steam 平台上&#xff0c;宣传片是产品营销中…

MyBatis-Plus (超详细 Spring版)

1 MyBatis-Plus 简介 1.1 简介 MyBatis-Plus&#xff08;简称MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为 简化开发、提高效率而生。 1.2 特性 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有…

地下井室可燃气体监测装置:守护地下安全,防患于未“燃”!

在城市的地下&#xff0c;隐藏着无数的燃气管道和井室&#xff0c;它们是城市基础设施建设的重要部分&#xff0c;燃气的使用&#xff0c;给大家的生活提供了极大的便利。在便利生活的背后&#xff0c;也存在潜在的城市安全隐患。 近年来&#xff0c;地下井室可燃气体泄漏事故…

BGP 基本配置实验

实验拓扑 实验需求 按照图示配置 IP 地址&#xff0c;R1 和 R5 上使用环回口模拟业务网段&#xff0c;R2&#xff0c;R3&#xff0c;R4 的环回口用于配置 Router-id 和建立 IBGP 邻居AS 200 运行 OSPF 实现内部网络互通R1&#xff0c;R2&#xff0c;R4&#xff0c;R5 运行 BGP…

解锁AIGC新时代:通义万相2.1与蓝耘智算平台的完美结合引领AI内容生成革命

前言 通义万相2.1作为一个开源的视频生成AI模型&#xff0c;在发布当天便荣登了VBench排行榜的榜首&#xff0c;超越了Sora和Runway等业内巨头&#xff0c;展现出惊人的潜力。模型不仅能够生成1080P分辨率的视频&#xff0c;而且没有时长限制&#xff0c;能够模拟自然动作&…

梦三国2游戏下载

梦三国2是由杭州电魂网络科技股份有限公司自主研发的一款将rts元素融合到rpg网游中的即时战略网络游戏。该作保留了前作的三国文化背景&#xff0c;继承了其特色玩法&#xff0c;优化了画面和操作体验&#xff0c;还基于玩家们的需求提供了有趣新颖的地图和系统。游戏主要分为p…

模型微调-基于LLaMA-Factory进行微调的一个简单案例

模型微调-基于LLaMA-Factory进行微调的一个简单案例 1. 租用云计算资源2. 拉取 LLaMa-Factory3. 安装依赖环境4. 启动 LLaMa-Factory 界面5. 从 Huggingface 下载模型6. 模型验证7. 模型微调 1. 租用云计算资源 以下示例基于 AutoDL 云计算资源。 在云计算平台选择可用的云计…

【十三】Golang 通道

&#x1f4a2;欢迎来到张胤尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 通道通道声明初始化缓冲机制无缓冲通道代码示例 带…

聊天服务器分布式改造

目前的聊天室是单节点的&#xff0c;无论是http接口还是socket接口都在同一个进程&#xff0c;无法承受太多人同时在线&#xff0c;容灾性也非常差。因此&#xff0c;一个成熟的IM产品一定是做成分布式的&#xff0c;根据功能分模块&#xff0c;每个模块也使用多个节点并行部署…

DeepSeek 医疗大模型微调实战讨论版(第一部分)

DeepSeek医疗大模型微调实战指南第一部分 DeepSeek 作为一款具有独特优势的大模型,在医疗领域展现出了巨大的应用潜力。它采用了先进的混合专家架构(MoE),能够根据输入数据的特性选择性激活部分专家,避免了不必要的计算,极大地提高了计算效率和模型精度 。这种架构使得 …

深入解析 BitBake 日志机制:任务调度、日志记录与调试方法

1. 引言&#xff1a;为什么 BitBake 的日志机制至关重要&#xff1f; BitBake 是 Yocto 项目的核心构建工具&#xff0c;用于解析配方、管理任务依赖&#xff0c;并执行编译和打包任务。在 BitBake 构建过程中&#xff0c;日志记录机制不仅用于跟踪任务执行情况&#xff0c;还…