深入理解数据在内存中是如何存储的,位移操作符如何使用(能看懂文字就能明白系列)文章超长,慢慢品尝

在这里插入图片描述

系列文章目录

C语言笔记专栏
能看懂文字就能明白系列
🌟 个人主页:古德猫宁-

🌈 信念如阳光,照亮前行的每一步


文章目录

  • 系列文章目录
    • 🌈 *信念如阳光,照亮前行的每一步*
  • 前言
  • 引子
  • 一、2进制和进制转化
    • 为什么要使用2进制的形式表示信息
    • 各种进制如何转换
      • 权重和二进制如何转换为十进制
      • 十进制如何转为二进制
      • 二进制如何转八进制
      • 2进制如何转16进制
  • 原码、补码、反码
  • 三、移位运算
    • 左移操作符
    • 右移操作符
    • 位操作符
      • 1、按位与 &
      • 2、按位或 |
      • 3、按位异或 ^
      • 4、按位取反 ~
  • 总结


前言

本节目标:理解数据在计算机中以什么样的方式表现,又用什么方式存储的,各种进制之间如何转换,数据在内存中的表现形式,左移操作符和右移操作符如何移,四个位操作符的计算规则


引子

在日常生活中,我们通常用十进制来表示一个数字,使用起来比较方便,但对于计算机而言,存储和处理信息的时候,通常以二进制的形式来表示(这些一连串的二进制数字称为位(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;
}

运行结果显示:
在这里插入图片描述
在这里插入图片描述

右移操作符

移动规则:首先右移运算分两种:

  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;//这是错误的

右移到底是算术右移还是逻辑右移取决于编译器的实现
大部分的编译器上是算术右移

小结:
逻辑右移:

  • 对应无符号整数,逻辑右移和算术右移效果是一样的。
  • 对于带符号整数,逻辑右移会在左侧填充零。这意味着无论正负,都在左侧填充零位。
  • 逻辑右移通常用于无符号整数或者希望右移时左侧补零的情况

算术右移:

  • 对于带符号整数,算术右移会在左侧填充符号位的值。如果原数是正数,就在左侧填充零,如果原数是负数,就在左侧填充一位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;
}

总结

本文内容比较多,只要掌握了使用二进制数来表示信息的方法及其运算机制,也就自然能够了解程序的运行机制了

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

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

相关文章

Docker部署开源分布式任务调度系统DolphinScheduler与远程访问办公

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

万能神器,轻松制作电子画册

你是不是经常需要制作各种宣传画册、产品画册、企业画册等等&#xff1f;是不是觉得手工制作太麻烦&#xff0c;而且效果也不尽如人意&#xff1f;现在有了这个神器&#xff0c;一切都可以轻松搞定&#xff01; FLBOOK在线制作电子杂志平台&#xff0c;一款功能强大的电子画册制…

数据结构与算法(五)回溯算法(Java)

目录 一、简介1.1 定义1.2 特性1.3 结点知识补充1.4 剪枝函数1.5 使用场景1.6 解空间1.7 实现模板 二、经典示例2.1 0-1 背包问题2.2 N皇后问题 一、简介 1.1 定义 回溯法&#xff08;back tracking&#xff09;是一种选优搜索法&#xff0c;又称为试探法&#xff0c;按选优条…

Linux下查看端口占用

第一种&#xff1a;通过命令查看 1.netstat -ntulp&#xff1a;查看所有的被占用的端口 在列表中最后一列就列出了&#xff0c;某个端口被占用的进程 其中&#xff1a; -t : 指明显示TCP端口 -u : 指明显示UDP端口 -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收…

2023人工智能和市场营销的融合报告:创造性合作的新时代需要新的原则

今天分享的人工智能系列深度研究报告&#xff1a;《2023人工智能和市场营销的融合报告&#xff1a;创造性合作的新时代需要新的原则》。 &#xff08;报告出品方&#xff1a;M&CSAATCHITHINKS&#xff09; 报告共计&#xff1a;11页 生成型人工智能的兴起和重要性 生成式…

关于物联网仪表ADW300 远传电表的详细介绍-安科瑞 蒋静

1概述 ADW300无线计量仪表主要用于计量低压网络的三相有功电能&#xff0c;具有体积小、精度高、功能丰富等优点&#xff0c;并且可选通讯方式多&#xff0c;可支持 RS485 通讯和 Lora、NB、4G、wifi 等无线通讯方式&#xff0c;增加了外置互感器的电流采样模式&#xff0c;从而…

用序列化思想为自动化测试「提供动力」

Python 对象序列化技术 对象序列化是指将对象从内存转换为字节流的过程&#xff0c;以实现对象的持久化存储和网络传输。它在许多场景中都非常重要&#xff0c;比如远程调用、长期数据存储等。 在Python中&#xff0c;我们主要使用pickle和marshal这两个模块来实现对象的序列…

【环境搭建】ubuntu22安装ros2

基于某种特殊需求&#xff0c;从Ubuntu16到22目前都尝试过安装ros、ros2 参考1&#xff1a;http://t.csdnimg.cn/DzvSe 参考2&#xff1a;http://t.csdnimg.cn/sOzr1 1.设置locale sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 s…

护眼台灯哪个品牌更好?考公护眼台灯推荐

小的时候&#xff0c;家里人对眼睛的重视程度比较低&#xff0c;我本人也没有爱护眼睛的习惯&#xff0c;属于在学校做眼保健操都要偷懒的那种&#xff0c;在小学时候就早早当上了“四眼仔”&#xff0c;随着时间的推移&#xff0c;现在成了一名高度近视人士&#xff0c;摘下眼…

C++中单引号‘‘和双引号““的区别

操作系统&#xff1a;Windows 10 IDE&#xff1a;CLion 单引号&#xff1a;表示一个字符&#xff0c;例如 a 双引号""&#xff1a;表示一个字符串&#xff0c;例如 "a" 在C中&#xff0c;使用双引号可以方便地创建字符串&#xff0c;而使用单引号可以方便…

echarts图之 底部滚动横轴 缩放图形大小

//折线图-堆叠面积图function pileLineChart(odata, dom){//放大缩小的代码startvar dataZoom [],y240;if(odata.xData.length > 7){dataZoom [{show: true,realtime: true,startValue:0, endValue:5,left:"center",top:"auto",right:"auto"…

前端笔记(四)Flex 布局

标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的派不规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 但是很多的网页布局都是块元素在一行中显示的&#xff0c;这时候就需要浮动和 Flex 布局&#xff0c;浮动只需要了解…