【C语言】简单介绍进制和操作符

Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述

请添加图片描述

本文简要介绍进制和操作符,愿能为您提供帮助!

文章目录

    • 进制和操作符
    • **二进制介绍**
    • **进制之间转换**
    • 二级制转换为十进制
    • 十进制转换二进制
    • 二进制转换为八进制和十六进制
    • **原码、反码、补码**
    • 原码、反码、补码之间的转换
    • 移位操作符(操作数只能是整数)
    • 位操作符(操作符必须是整数)
    • 下标访问[]、函数调用()(简单过一下)
    • 优先级
    • **结合性**
    • 表达式求值
    • 整型提升
    • 算术转化

进制和操作符


二进制介绍

十进制属于一种常见的进制,它满足满十进一并且数字每一位都是0~9数字组成的。 二进制也是同理满二进一并且数字每一位都是0~1数字组成的。

:二级制、八进制、十六进制,只是数值的不同表现形式

比如

数字:15
二级制表示:1111
八进制表示:17
十进制表示:15
十六进制表示:F

进制之间转换

关于这一点,首先知道每个进制的每一位有权重,N进制的数字从右到左是个位、十位、百位…,分为每一位权重是(N)0 ,(N)1 ,(N)2…。

二级制转换为十进制

请添加图片描述

说明:将2进制的每个位乘于对应的权重值,再全部相加

十进制转换二进制

请添加图片描述

二进制转换为八进制和十六进制

  • 八进制:八进制的数字每一位是0~7的数字,各自写成二进制,最大数字7的二进制是111,所以最多有3个2进制位就足够了

  • 十六进制:十六进制的数字每一位是0~9,a ~f各自写成二进制,最大数字f的二进制是1111,所以最多有4个2进制位就足够了

对于2进制转换为8进制和16进制时,是从2进制序列中右边低位开始向左每3(4)个2进制位会换算一个8(16)进制为,剩余不够3(4)个2进制的直接换算。

比如:

二进制转换八进制二进制:001 101 011八进制:1    5    3二进制转换十六进制二进制:0110  1011八进制:  6     b(11)

原码、反码、补码

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

三种表示方法均有符号位和数值位两部分组成

  • 符号位:是一个二进制数的最高位(最左边的位),如果符号位为0,则表示该数为正数;如果符号位为1,则表示该数为负数
  • 数值位:除了符号位,剩余的都是数值位

原码、反码、补码之间的转换

  1. 正整数的原码、反码、补码**都是相同**

  2. 负整数的三种表示方式各不同

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

请添加图片描述

对于整型来说:数据存放在内存中其实存放的是补码

  • 在计算机系统中,数值一律用补码来表示和存储。使用补码,可以将符号位和数值位统一处理
  • 加法和减法可以统一处理(CPU只有加法器) 此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路

移位操作符(操作数只能是整数)

左移操作数 <<

移位规则:左边抛弃,右边补0

请添加图片描述

右移操作数 >>

移位规则:分为逻辑右移、算术右移

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

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

请添加图片描述

请添加图片描述

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

在位运算中,将一个数向左移动一位相当于将其乘以2;将一个数向右移动一位相当于将其除以2


位操作符(操作符必须是整数)

位操作符:``& | ^ ~`

  1. 按位与(&):有0为0,全1为1
  • 使用规则:当两个对应的二进制位,至少存在一边为0,那么结果为0,若当两边全为1,结果才是1

​ 2.按位或(|):有1为1,全0为0

  • 使用规则:当两个对应的二进制位,至少存在有一边为1,那么结果为1,若当两边全为0,结果才是0

​ 3.按位异或(^):相同为零,不同为一

  • 使用规则:当两个对应的二进制位,两边数字相同,那么结果为0,若当两边数字不相同,那么结果为1

​ 4.按位取反(~):

  • 使用规则:用于操作符的每个二进制位取反,将1转化位0,0转化位1

典型两道题:

一道变态的面试题:

题目:实现两个数的交换(不能创建临时变量)

int main()
{int a = 10;int b = 20;a = a ^ b;printf("a = %d,b = %d\n", a, b);//b=a^b^b=a^0=a;b = a ^ b;//a=a^a^b=b;a = a ^ b;printf("a = %d,b = %d", a, b);return 0;
}

小总结:

  1. ^位操作不考虑顺序问题
  2. a^a==0
  3. a^0==a

问题:求一个整数存储在内存中的二进制中1的个数

int main()
{int num = 15;//00000000 00000000 00000000 00001111int i = 0;int cout = 0;//计数for (i = 0; i < 32; i++){if (num & (1 << i))//00000000 00000000 00000000 00000001 一开始cout++;}printf("二进制中1的个数=%d", cout);return 0;
}

说明:利用了按位与操作符的特点,有0为0,全是1才是1

缺点:需要循环32次

优化方案:

int main()
{int num = 15;int i = 0;int count = 0;//计数while (num){count++;num = num & (num - 1);}printf("⼆进制中1的个数 = %d\n", count);return 0;
}
达到了优化的效果,但是难以想到

逗号表达式

exp1,exp2,exp3,..expN

逗号表达式:使用逗号隔开的多个表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果

使用场景:

常规写法
while (a > 0)
{a = get_val();count_val(a);
}
使用逗号表达式while (a = get_val(), count_val(a), a>0)
{
}   

注:

z=(2,3,4)//4 括号里面是表达式
z=2,3,4//2  3,4是逗号表达式

下标访问[]、函数调用()(简单过一下)

下标引用操作符

操作数:一个数组名+一个索引值

int nums[10];
nums[9]=10;
[]的两个操作数是nums和9

函数调用操作符

接收一个或者多个操作数:第一个操作数是函数名;剩余的操作数就是传递给函数的参数

void test()
{printf("hehe\n");
}int main()
{test();//这里()就是函数调用操作符
}

操作符的属性

C语言的操作符有两个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序

优先级

优先级:如果一个表达式包含多个运算符,根据与运算符的优先级判断哪个运算符先执行,并且各种运算符的优先级是不同的

3+4*5;

说明:这个表达式有加法运算符和乘法运算符。由于乘法运算符的优先级高于加法。导致先计算4*5,而不是3+4;

结合性

如果两个运算符优先级相同,优先级无法判断,这个时候就要看结合性,则根据运算符是左结合,还是右结合,决定执行顺序。

大部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符

具体还是看

请添加图片描述

参考:https://zh.cppreference.com/w/c/language/operator_precedence

注意:即使有了操作符的优先级和结合性,写出的表达式依然有可能不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在潜在风险的,建议不要写出特别不负责的表达式

比如:

#include <stdio.h>
int main()
{
int i = 1;
int ret = (++i) + (++i) + (++i);
printf("%d\n", ret);
printf("%d\n", i);
return 0;
}
//尝试在linux 环境gcc编译器,VS2013环境下都执⾏,看结果。

gcc编译器运行结果:

请添加图片描述

vs2022运行结果

请添加图片描述


表达式求值

整型提升

C语言中整型算术运算总是以省缺(默认)整型类型的精度来进行。对于表达式中的字符和短整型操作数为了获得这个精度之前被转换为普通整型,这个转换称为整型提升

整型提升的意义:

  • 表达式的整型运算:CPU对应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int字节长度,同时也是CPU的通用寄存器的长度
  • 关于两个char类型的相加,在CPU执行时实际上也是先转换为CPU内整形操作数的标准长度
  • CPU(genenral-purpose CPU)是难以直接实现两个8比特直接相加运算(虽然机器指令中可能有这种字节相指令)。对此表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算

如何进行整形提升?

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

负数的整型提升

char c1=-1;
//1111 1111(补码)
char为有符号类型
整型提升的时候,高位补充符号位(1)
提升结果1111 1111 1111 1111 1111 1111 1111 1111

正数的整型提升

char c2=1;
//0000 0001
char为有符号类型
整型提升的时候,高位补充符号位(0)
提升结果0000 0000 0000 0000 0000 0000 0000 0000    

例子:

int main()
{char a = 5;//00000000 00000000 00000000 00000101//00000101 - a (截断后存储到a中)char b = 127;//00000000 00000000 00000000 01111111//01111111 - b (截断后存储到b中)char c = a + b;//00000000 00000000 00000000 00000101//00000000 00000000 00000000 01111111//00000000000000000000000010000100 - a+b//10000100 - cprintf("%d\n", c);//c进行了整型提升 按符号位填充//11111111111111111111111110000100//10000000000000000000000001111011//10000000000000000000000001111100//-124//%d 是按照10进制的形式打印有符号的整型return 0;
}

算术转化

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

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

如果某个操作数的类型在上面这个列表中排名靠后,那么首先要转化为另外一个操作数的类型后执行运算。
***请添加图片描述

谢谢大家的观看,这里是个人笔记,希望对你学习C有帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异常的种类

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 Oracle 运行时错误可以分为 Oracle 错误和用户自定义错误&#xff0c;与此对应&#xff0c;根据异常产生的机制和原理&#xff0c;可将 Oracle 的系统异常分为 3 种 预定义…

使用VPN时,Java程序无法访问远程网络的解决办法

应用场景&#xff1a; 电脑连接VPN之后&#xff0c;Java程序无法连接远程服务&#xff0c;比如第三方接口、远程数据库连接、远程微服务等。我个人遇到的情况有连接海康威视SDK&#xff0c;influxdb以及一些微服务。 解决办法&#xff1a; 启动Java时加入参数&#xff1a;-D…

比较好玩的车子 高尔夫6

https://www.sohu.com/a/484063087_221273 四万多如愿收获手动挡高尔夫6&#xff0c;可靠性、经济性、操控性兼顾_搜狐汽车_搜狐网 2.基本上其他人也不知道到底是什么相关的车子信息

基于单片机和ICL7135多档位数字电压表设计

**单片机设计介绍&#xff0c;基于单片机和ICL7135多档位数字电压表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机和ICL7135的多档位数字电压表设计是一个结合了硬件与软件技术的综合性项目。这种设计旨在实现一…

Pnpm + Turbo 搭建 Web Component Monorepo 组件库

技术选型 使用 Pnpm Turbo 搭建 Web Component Monorepo项目 stencil-component-ui 组件库 pnpm 作为包管理器Turborepo 作为构建系统Vitepress 管理文档 pnpm 技术 什么是 pnpm? 它有哪些优势&#xff1f; pnpm 跟 npm、yarn一样&#xff0c;都是用于管理Node包依赖的管…

iOS App Store审核要求与Flutter应用的兼容性分析

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

云岚到家项目

一.项目介绍 云岚到家项目是一个家政服务o2o平台&#xff0c;互联网家政是继打车、外卖后的又一个风口&#xff0c;创业者众多&#xff0c;比如&#xff1a;58到家&#xff0c;天鹅到家等&#xff0c;o2o&#xff08;Online To Offline&#xff09;是将线下商务的机会与互联网…

openharmony launcher 调研笔记(03)UI 数据装配

最近在看launcher&#xff0c;把自己调研的点做个笔记&#xff0c;持续修改更新中&#xff0c;个人笔记酌情参考。 桌面上半部分包含父子逻辑&#xff1a; Column() { PageDesktopLayout(); } PageDesktopLayout->GridSwiper->Swiper->SwiperPage 1.PageDe…

25.11 MySQL 视图

1. 常见的数据库对象 对象描述表(TABLE)存储数据的逻辑单元, 以行和列的形式存在, 列就是字段, 行就是记录.数据字典系统表, 存放数据库相关信息的表. 数据通常由数据库系统维护, 程序员通常不可修改, 只可查看.约束(CONSTRAINT)执行数据校验的规则, 用于保证数据完整性的规则…

2024马来西亚电商选品博览会

2024马来西亚电商选品博览会 展会概况 展会名称&#xff1a;2024马来西亚电商选品博览会 主办单位&#xff1a;广东进出口商会 时间:2024.11.29-12.1 地点&#xff1a;马来西亚国际贸易展览中心(MITEC) 展览面积&#xff1a;10000平方米 展会简介 2024马来西亚跨境电商选…

包和final.Java

1&#xff0c;包 包就是文件夹。用来管理不同功能的Java类&#xff0c;方便后期代码的维护。 &#xff08;1&#xff09;包名的规则是什么&#xff1f; 公司域名反写报的作用&#xff0c;需要全部英文小写&#xff0c;见名知意。com.itheima.domain &#xff08;2&#xff…

抓住风口,快速上手RAG应用开发!

免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案」&#xff1b; 不要急着评判文章列出的观点&#xff0c;只需代入其中&#xff0c;适度…

蓝桥杯第十一届c++大学B组详解

目录 1.字符串排序 2.门牌制作 3.即约分数 4.蛇型填数 5.跑步锻炼 6.七段码 7.成绩统计 8.回文日期 9.字串分值和 10.平面切分 1.字符串排序 题目解析&#xff1a;这个题目真没搞懂。有会的大佬教我一下谢谢。 2.门牌制作 题目解析&#xff1a;出过超级多这类题目&am…

NumPy进阶(二)

2. NumPy进阶(二) 2.1 Numpy数组操作 2.1.1 添加元素 numpy.append 函数在数组的末尾添加值。 追加操作会分配整个数组&#xff0c;并把原来的数组复制到新数组中 注意&#xff1a; 插入的维度要保证所有数组的长度是相同的如果没有指定轴&#xff0c;数组会被扁平处理 ndarr…

教你如何玩转副业:开启编程副业新篇章

前言 在浩瀚的编程海洋中&#xff0c;C语言以其简洁、高效、贴近硬件的特性&#xff0c;成为无数程序员心中的“白月光”。作为一位程序员&#xff0c;如果你不仅掌握了这门语言的精髓&#xff0c;更渴望通过副业来挑战自我、实现价值。那么&#xff0c;如何用C语言开启你的副…

亚信安慧AntDB:在数据的宇宙中探索无限可能

亚信安慧AntDB数据库探索出自主可控的数据库架构&#xff0c;在架构层面消除应用对特定数据库的依赖。它以其稳定可靠的性能和高度可伸缩性而备受赞誉。AntDB数据库架构通过引入创新的分布式体系结构&#xff0c;充分利用集群资源&#xff0c;实现数据的高效分布和快速存取。 …

【计算机考研】408算法大题怎么练?

先说结论&#xff1a;基础阶段学好各个数据结构与&#xff0c;重点是数组、链表、树、图。然后强化阶段突破算法提 在基础阶段&#xff0c;并不需要过于专门地练习算法。相反&#xff0c;基础阶段的重点应该放在对各种数据结构原理的深入理解上。在我个人的经验中&#xff0c;…

HarmonyOS实战开发-如何使用 geolocation 实现获取当前位置经纬度

介绍 本示例使用 geolocation 实现获取当前位置的经纬度,然后通过 http 将经纬度作为请求参数,获取到该经纬度所在的城市。通过 AlphabetIndexer 容器组件实现按逻辑结构快速定位容器显示区域。 效果预览 使用说明 1.进入主页,点击国内热门城市,配送地址会更新为选择的城…

【Erlang】【RabbitMQ】Linux(CentOS7)安装Erlang和RabbitMQ

一、系统环境 查版本对应&#xff0c;CentOS-7&#xff0c;选择Erlang 23.3.4&#xff0c;RabbitMQ 3.9.16 二、操作步骤 安装 Erlang repository curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash安装 Erlang package s…

CAXA电子图版2019版 下载地址及安装教程

CAXA电子图板是一款由国内软件公司CAXA开发的专业CAD&#xff08;计算机辅助设计&#xff09;软件。它主要用于绘制和编辑各种类型的二维图纸和工程图纸&#xff0c;广泛应用于建筑、机械、电气和电子等行业。 CAXA电子图板具有以下主要功能和特点&#xff1a; 二维绘图&…