深入理解数据在内存中是如何存储的,位移操作符如何使用(能看懂文字就能明白系列)文章超长,慢慢品尝
系列文章目录
C语言笔记专栏
能看懂文字就能明白系列
🌟 个人主页
:古德猫宁-
🌈 信念如阳光,照亮前行的每一步
文章目录
前言
本节目标:
理解数据在计算机中以什么样的方式表现,又用什么方式存储的,各种进制之间如何转换,数据在内存中的表现形式,左移操作符和右移操作符如何移,四个位操作符的计算规则
引子
在日常生活中,我们通常用十进制来表示一个数字,使用起来比较方便,但对于计算机而言,存储和处理信息的时候,通常以二进制的形式来表示(这些一连串的二进制数字称为位(bit))。因为二进制的形式能够很容易地被表示,存储和传输。
在程序中,即使是用十进制数和文字等记述信息,在编译后也会转换成二进制的值
如图:
对于用二进制数表示的信息,计算机不会区分它是数值,文字,还是某种图片的模式等,而是根据编写程序的各位对计算机发出的指示来进行信息的处理(运算)。
那么接下来让我们深入理解数据在计算机中是如何存储的吧
一、2进制和进制转化
为什么要使用2进制的形式表示信息
其实所谓的2进制,8进制,16进制以及我们日常使用的十进制都是一个数值的不同表示形式而已。至于计算机的信息数据为什么只能用二进制的计数方式这种形式,其实是取决于IC这种电子部件(这里不讲述IC是什么,有兴趣的伙伴自己搜一下)
二进制数的位数一般是8位,16位,32位,都是8的倍数,为什么呢?这是因为计算机处理的信息的基本单位是字节(也就是8个比特位),字节是最基本的信息计量单位。而所说的位是最小单位(注意区分)内存和磁盘都使用字节单位来存储和读写数据,使用位单位则无法读写数据。
各种进制如何转换
比如:数字15的各种进制的表示形式:
15的二进制:1111
15的八进制:17
15的十进制:15
15的十六进制:F(大小写都可以)
首先我们从10进制讲起吧,10进制比较常用,小孩子都知道的一个知识:
- 10进制的数字每一位都是0到9的数字组成
- 10进制中满十进一
那换成二进制也是同一个道理:
- 二进制的数字由1和0组成
- 二进制中满二进一
比如上面15的二进制1111就是二进制数字
权重和二进制如何转换为十进制
那你有没有想过十进制的123为什么就是123呢?
其实10进制的每一位是权重的(权重也称位权),10进制的数字从右向左是个位,十位,百位……,每一位分别的权重是10的零次方,10的一次方,10的二次方……,以此类推。
如图所示:
这种方式也同样适合二进制数,即第一位(上图的个位)是2的零次方,第二位(上图的十位)是2的一次方,第三位是2的二次方……
各位初学的伙伴用上面的方式将开头的所说1111拿来练练吧,看看是如何将1111转换为15的
十进制如何转为二进制
那十进制又如何转换成二进制的呢???
方法很简单,将一个10进制的数整除2之后得到的余数先保留下来,接着往下除,直到10进制的数不能再被2整除即可,如图所示:
二进制如何转八进制
8进制的数字由0到7组成,0~7的数字,各自写成2进制,最多有3个2进制位就足够了,比如7的2进制是111,所以在2进制转8进制的时候,从2进制序列中从右边低位开始向左每3个2进制位会换算成一个8进制位,剩余不够3个2进制位的直接换算。
如:2进制的01 101 011,换成8进制就是:0153(0开头的数字会被当做8进制)
2进制如何转16进制
16进制的数字每一位由0~9,a到f组成,各自写成2进制,最多有4个2进制位就足够了
比如f的二进制是1111,所以在2进制转16进制的时候,从2进制序列中右边低位开始向左每4个2进制位换算成一个16进制位,剩余不够4个2进制的直接换算。
比如:2进制的0110 1011,换成16进制为:0x6b(0110为6,1011为b)注意:16进制表示的时候前面加0x
如图所示:
二、原码、补码、反码
整数的2进制表示方法有三种,即原码,补码,反码
有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位为符号位,其他都是数值位。
符号位都是用0表示一个数为正数,用1表示一个数为负数
特别的是:正整数的原码,反码,补码都相同
负整数的三种表示方法各不相同
- 原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码
- 反码:原码的符号位不变,将其他位依次按位取反得到的就是反码
- 补码:反码+1得到的就是补码
反码得到原码也是可以使用:取反,+1的操作
对于整型来说:数据存放内存中其实存放的是补码
在计算机中,数值一律用补码来表示和存储。
原因:使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理(CPU只有加法器,计算机在做减法运算时,实际上内部是在做加法运算,是不是感觉很神奇),此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
三、移位运算
了解完二进制数的机制后,接下来我们来看一下运算,和10进制数一样,四则运算同样也可以使用在二进制中,主要注意逢二进一就行。
首先来解释一下什么是移位运算。移位运算指的是将二进制数值的各数位进行左右移位的运算。
如何进行移位运算呢,这里就要来介绍两个移位操作符了
- <<左移操作符
- >>右移操作符
注意:移位操作符的操作数只能是整数
左移操作符
移动的规则:左边抛弃,右边补零
例如以下代码:
#include <stdio.h>
int main()
{int num = 10;int n = num << 1;//这里的1表示向左移动一个比特位,后面有图printf("n= %d\n", n);printf("num= %d\n", num);return 0;
}
运行结果显示:
右移操作符
移动规则:首先右移运算分两种:
- 逻辑右移:左边用0填充,右边丢弃
- 算术右移:左边用原该值的符号位填充,右边丢弃
#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;//这是错误的
右移到底是算术右移还是逻辑右移取决于编译器的实现
大部分的编译器上是算术右移
小结:
逻辑右移:
- 对应无符号整数,逻辑右移和算术右移效果是一样的。
- 对于带符号整数,逻辑右移会在左侧填充零。这意味着无论正负,都在左侧填充零位。
- 逻辑右移通常用于无符号整数或者希望右移时左侧补零的情况
算术右移:
- 对于带符号整数,算术右移会在左侧填充符号位的值。如果原数是正数,就在左侧填充零,如果原数是负数,就在左侧填充一位1。
- 算术右移用于带符号整数,以保持负数的符号位。
位操作符
1、按位与 &
计算规则:对应的二进制进行与运算,只要有0就是0,两个同时为1才是1
例如:
int main()
{int a = 3;int b = -5;int ret = a & b;printf("%d", ret);return 0;
}
解释:
3的补码:00000000000000000000000000000011
-5的原码:1000000000000000000000000000101
-5的反码:11111111111111111111111111111111010
-5的补码:11111111111111111111111111111111011
运行结果:
2、按位或 |
计算规则:对应的二进制位进行或运算,只要有1就是1,两个同时为0才是0
int main()
{int a = 3;int b = -5;int ret = a | b;printf("%d", ret);return 0;
}
3的补码: 00000000000000000000000000000011
-5的原码:10000000000000000000000000000101
-5的反码:11111111111111111111111111111010
-5的补码:11111111111111111111111111111011
运行结果:
3、按位异或 ^
计算规则:对应的二进制位进行异或运算,相同为0,相异为1
int main()
{int a = 3;int b = -5;int ret = a ^ b;printf("%d", ret);return 0;
}
运行结果:
这里不一一解释了,各位可以动手运算一下
4、按位取反 ~
计算规则:将自身的二进制位进行取反操作,即0转1,1转0
1的补码:00000000000000000000000000000001
取反操作后:11111111111111111111111111111110(补码)
反码:10000000000000000000000000000001
原码:10000000000000000000000000000010(-2)
int main()
{int a = 1;int b = ~a;printf("%d", b);return 0;
}
总结
本文内容比较多,只要掌握了使用二进制数来表示信息的方法及其运算机制,也就自然能够了解程序的运行机制了
相关文章:

深入理解数据在内存中是如何存储的,位移操作符如何使用(能看懂文字就能明白系列)文章超长,慢慢品尝
系列文章目录 C语言笔记专栏 能看懂文字就能明白系列 🌟 个人主页:古德猫宁- 🌈 信念如阳光,照亮前行的每一步 文章目录 系列文章目录🌈 *信念如阳光,照亮前行的每一步* 前言引子一、2进制和进制转化为什么…...

ArcGIS提示当前许可不支持影像服务器
1、问题: 在用ArcGIS上处理影像栅格数据时(比如栅格数据集裁剪、镶嵌数据集构建镶嵌线等)经常会出现。 无法启动配置 RasterComander.ImageServer <详信息 在计算机XXXXX上创建服务器对象实例失败 当前许可不支持影像服务器。 ArcGIS提示当…...

Android P 9.0 增加以太网静态IP功能
效果图 一、Settings添加以太网的配置: 1、vendor\mediatek\proprietary\packages\apps\MtkSettings\res\xml\network_and_internet.xml <com.android.settingslib.RestrictedPreferenceandroid:key"ethernet_settings"android:title"string/et…...

Android12之MediaCodec硬编解码调试手段(四十九)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…...

2.Ansible的copy模块,我最常用的模块
1. 简述 先从我自身的情况来说,我不是运维人员,并且对linux操作也不是特别熟悉,所以工作中我使用ansible基本就是在平常的自动化部署中,而使用最多的模块就是copy模块。我使用copy模块也主要是来替换生产环境的配置文件。所以&am…...

python程序将部分文件复制到指定目录
geotools-28.2中的lib一共有264个jar包,但我只想将部分100个左右jar包引导我的环境中,那个就需要从目录中找出想要的那100个jar,手动挑选太费时间,我简单的写了个小脚本来实现。 我将想要的jar文件名和路径存放到txt中࿰…...

5分钟教你利用服务器,打造1个 7*24H直播的直播间
最近在折腾无人直播。觉得还挺有意思,接下来就分享一下如何实现。实现后就可以给一些主流的平台直播间不间断推流,达到无人直播的效果。 前提:拥有一台服务器。最好流量是1T或者以上。直播对流量要求比较高,视频码率越大ÿ…...

卡通渲染总结《二》
关于技术的方面,一方面就是其轮廓边缘检测: 主要的方法可以被分为基于图片空间和对象空间,对象空间比图片空间会多一些立体坐标位置的信息。 轮廓类型分类 首先我们顶一下轮廓是什么,从一个视角看去如果一条边相邻的两个面其恰…...

严蔚敏数据结构p17(2.19)——p18(2.24) (c语言代码实现)
目录 2.19已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于 mink 且小于 maxk 的元素(若表中存在这样的元素)同时释放被删结点空间,并分析你的算法的时间复杂度(注意:mink 和 maxk 是给定的个参变量,它们的值可以和表…...

0007Java程序设计-ssm基于微信小程序的在线考试系统
文章目录 **摘要**目 录系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅🐧裙:776871563 摘要 网络技术的快速发展给各行各业带来了很大的突破,也给各行各业提供了一种新的管理技术,基于微信小程序的在线考试…...
php 使用多线程
fpm cli socket redis PHP多线程-阿里云开发者社区 常驻内存:op cli EasyTask: PHP常驻内存多进程任务管理器,支持定时任务(PHP resident memory multi-process task manager, supports timing tasks) 协程:swoole Swoole - PHP 协…...
基于MapBox的方法封装及调用
目录 1、初始化地图 2、单独添加瓦片 3、开启绘制方法 4、移除绘制数据 5、拾取经纬度 6、加点 7、加线 8、加面 9、更改图层顺序 10、更改实体样式 11、移除实体或图层 12、定位某个点 13、定位数组 14、锁定实体跟随视角 15、获取视窗 16、设置俯仰角 17、设…...
华为OD机试真题-虚拟游戏理财-2023年OD统一考试(C卷)
题目描述: 在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。现有一家Bank,它提供有若干理财产品m,风险及投资回报不同,你有N(元)进行投资,能接受的总风险值为X。 你要在可接受范围内选择最优的投资方式获得最大回报。 说明: 在虚拟游戏中…...
解决 video.js ios 播放一会行一会不行
最近用video 进行m3u8视频文件播放,但是途中遇到了 安卓和电脑端都能打开,ios有时可以播放有时播放不了 出现问题原因: ios拿到视频流前需要预加载视频,如果当前视频流还没有打开过,ios拿不到视频流的缓存,…...

排序分析(Ordination analysis)及R实现
在生态学、统计学和生物学等领域,排序分析是一种用于探索和展示数据结构的多元统计技术。这种分析方法通过将多维数据集中的样本或变量映射到低维空间,以便更容易理解和可视化数据之间的关系。排序分析常用于研究物种组成、生态系统结构等生态学和生物学…...

Tomcat主配置文件(server.xml)详解
前言 Tomcat主配置文件(server.xml)是Tomcat服务器的主要配置文件,文件位置在conf目录下,它包含了Tomcat的全局配置信息,包括监听端口、虚拟主机、安全配置、连接器等。 目录 1 server.xml组件类别 2 组件介绍 3 se…...

Python实现简单的区块链,实现共识算法、Merkle Tree(默克尔树)、冲突解决、添加交易等功能
Python实现简单的区块链 记录自己假期所学相关内容 文章中的内容,开源代码地址见文末。 文章目录 Python实现简单的区块链1、分模块实现简单的单节点区块链1.1 Transaction类1.2 DaDaMessage类1.3 Block类1.4 Dada_BlockCoin类1.5 主函数BlockChainApp类1.6 主函数…...

深入理解 Java 虚拟机(JVM)从入门到精通
目录 一、JVM内存结构1、堆(Heap)(1)特点(2)堆内存分配(3)晋升到老年代的方式(4)堆内存检验方式2、虚拟机栈(VM Stack)(1&…...

哔哩哔哩自动评论软件,其成果展示与开发流程和代码分享
先来看实操成果,↑↑需要的同学可看我名字↖↖↖↖↖,或评论888无偿分享 一、背景介绍 随着互联网的发展,哔哩哔哩作为国内最大的弹幕视频网站之一,吸引了越来越多的用户。为了更好地推广自己的作品,许多UP主希望能够通…...

Qt OpenCV 学习(一):环境搭建
对应版本 Qt 5.15.2OpenCV 3.4.9MinGW 8.1.0 32-bit 1. OpenCV 下载 确保安装 Qt 时勾选了 MinGW 编译器 本文使用 MinGW 编译好的 OpenCV 库,无需自行编译 确保下载的 MinGW 和上述安装 Qt 时勾选的 MinGW 编译器位数一致,此处均为 x86/32-bit下载地址…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...