【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.rhkb.cn/news/302911.html

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

相关文章

论文解读:吴恩达来信AI Agent技巧—利用自我反馈的迭代细化技术

《自我完善&#xff1a;利用自我反馈的迭代细化技术》 https://arxiv.org/pdf/2303.17651.pdf 摘要 Large language models (LLMs) 经常无法在一次尝试中生成最佳输出。受人类在修改书面文本时所表现出的迭代精炼过程的启发&#xff0c; 我们提出了 SELF-REFINE&#xff0c…

R语言绘图 | 散点小提琴图

原文链接&#xff1a;R语言绘图 | 散点小提琴图 本期教程 写在前面 本期的图形来自发表在Nature期刊中的文章&#xff0c;这样的基础图形在日常分析中使用频率较高。 获得本期教程数据及代码&#xff0c;后台回复关键词&#xff1a;20240405 绘图 设置路径 setwd("You…

CSDN 广告太多,停更通知,转移到博客园

文章目录 前言新博客地址 前言 CSDN的广告实在是太多了&#xff0c;我是真的有点忍不了。直接把广告插在我的文章中间。而且我已经懒得找工作了&#xff0c;我当初写CSDN的目的就是为了找工作&#xff0c;有个博客排名。当时经济环境实在是太差了。我也没必要纠结这个2000粉丝…

因为使用ArrayList.removeAll(List list)导致的机器重启

背景 先说一下背景&#xff0c;博主所在的业务组有一个核心系统&#xff0c;需要同步两个不同数据源给过来的数据到redis中&#xff0c;但是每次同步之前需要过滤掉一部分数据&#xff0c;只存储剩下的数据。每次同步的数据与需要过滤掉的数据量级大概在0-100w的数据不等。 由…

快排序解读

排序算法是计算机科学中不可或缺的一部分&#xff0c;它们在各种数据处理场景中发挥着关键作用。在众多排序算法中&#xff0c;快速排序以其高效的性能和简洁的实现成为了许多程序员的首选。今天&#xff0c;我们就来深入剖析快速排序算法&#xff0c;了解其原理、实现方式以及…

比特币革命:刚刚开始

作者&#xff1a;Marius Farashi Tasooji 编译&#xff1a;秦晋 要充分理解比特币及其含义&#xff0c;首先必须理解什么是价值&#xff0c;什么是货币。以及是什么赋予资产价值&#xff1f; 这个问题看似愚蠢&#xff0c;但实际上非常有趣。我们的生活是由我们消费或出售的物品…

【问题解决】ubuntu安装新版vscode报code-insiders相关错误

问题 目前 vscode官网 最新的包为 insiders_1.89.0-1712297812_amd64.deb &#xff0c;双击或者使用sudo dpkg -i code-insiders_1.89.0-1712297812_amd64.deb安装后报错&#xff0c;执行其他命令也报错。 安装环境&#xff1a;ubuntu18.04 dpkg: 处理软件包 code-insiders (…

Taro框架中的H5 模板基本搭建

1.H5 模板框架的搭建 一个h5 的基本框架的搭建 基础template 阿乐/H5 Taro 的基础模板

在Spring中使用Redis

端口怎么设置&#xff0c;看我前一篇文章 前面使用jedis&#xff0c;通过Jedis对象中各种方法来操作redis的。 此处Spring中则是通过StringRedisTemplate来操作redis。 最原始提供的类是RedisTemplate StringRedisTemplate是RedisTemplate的子类&#xff0c;专门处理文本数据的…

PUBG绝地求生29.1版本延迟高/卡顿/掉帧/丢包的快速解决方法

要想在绝地求生中获得好成绩&#xff0c;咱们需求把握一些根本的游戏技巧。比方&#xff0c;在挑选降落点时&#xff0c;咱们可以运用u标签来着重“安全”二字。挑选一个相对较为安全的降落点可以防止与其他玩家过早触摸&#xff0c;给自己争夺更多时间来搜集资源和配备。接下来…

Vant DropdownMenu 下拉菜单带搜索功能

Vant DropdownMenu 下拉菜单带搜索功能 效果图&#xff1a; 上代码&#xff1a; <van-dropdown-menu active-color"#E33737"><van-dropdown-item ref"dropdownItem"><template #title><span>{{ dropdownItem.text }}</span…

Mysql密码修改问题

docker安装mysql&#xff0c;直接拉取镜像&#xff0c;挂载关键目录即可启动&#xff0c;默认3306端口。此时无法直接连接&#xff0c;需要配置密码。docker进入mysql容器中 docker exec -it mysql bash #mysq是容器名称&#xff0c;也可以用容器id通过修改mysql的配置进行免密…

应用商店备案登记流程解析

引言&#xff1a; 随着智能手机的普及和移动互联网的发展&#xff0c;移动应用程序&#xff08;App&#xff09;已成为人们日常生活中不可或缺的一部分。在开发一个App之后&#xff0c;开发者需要将其上传到应用商店进行审核和上架。然而&#xff0c;在上架之前&#xff0c;开…

智慧运维解决方案

1&#xff1a;排口截污 控源截污、内源治理、生态修复 通过传感器对周围环境进行监测&#xff0c;将雨水和污水分别流入不同的管道&#xff0c;进行分流和净化处理&#xff0c;守好排污口&#xff0c;解决城市雨水和污水污染问题&#xff0c;减少城市环境污染。 2&#xff1…

html骨架以及常见标签

推荐一个网站mdn。 html语法 双标签&#xff1a;<标签 属性"属性值">内容</标签> 属性&#xff1a;给标签提供附加信息。大多数属性以键值对的形式存在。如果属性名和属性值一样&#xff0c;可以致谢属性值。 单标签&#xff1a;<标签 属性"属…

私域电商客户要挨一刀的“订单发货管理”,微信:必须强制接入

文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 引言&#xff1a;超90%的私域运营商家都见到了或者说遇到了这个问题&#xff0c;如果没有读懂这个微信的模型机制&#xff0c;一定会懵逼&#xff0c;微三云营销总监胡佳…

计算机网络:数据链路层 - 点对点协议PPP

计算机网络&#xff1a;数据链路层 - 点对点协议PPP PPP协议的帧格式透明传输字节填充法零比特填充法 差错检测循环冗余校验 对于点对点链路&#xff0c;PPP协议是目前使用最广泛的数据链路层协议。比如说&#xff0c;当用户想要接入互联网&#xff0c;就需要通过因特网服务提供…

被狠狠拷打!想冲 PDD 机器学习算法岗,一面直接挂了。。。

节前&#xff0c;我们社群组织了一场技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学&#xff0c;针对新手如何机器学习算法、企业级落地场景、大模型的发展趋势与落地实践、新人该如何备考、面试常考点等热门话题进行了深入的讨论。 …

LoRa自组网络设计 6

1 深入了解LoRaWan 1.1 LoRaWan概述 LoRaWAN采用星型无线拓扑 End Nodes 节点 Gateway 网关 Network Server 网络服务器 Application Server 应用服务器 LoRa联盟是2015年3月Semtech牵头成立的一个开放的、非盈利的组织&#xff0c;发起成员还有法国Actility&#xff0c;中国…

FL Studio21水果软件有哪些新功能?如何下载破解版

FL Studio 21是一款由Image-Line公司开发的专业的音乐制作软件&#xff0c;它提供了音乐编曲、录音、编辑、混音等多种功能&#xff0c;非常适合专业音乐制作人、DJ及音乐爱好者使用。这款软件不仅具有高级的音频编辑功能&#xff0c;如切片、时间伸缩、音高调整&#xff0c;还…