软件开发必知必会的计算机基础
1.计算机基本介绍
1.1 什么是计算机
计算机(Computer)俗称为电脑,计算机是一种高速计算的电子机器,计算机可以进行数值运算,逻辑判断,接收或者是存储信息数据(文本、图片、音频、视频),按照存储在其内部的程序对海量的数据进行高速、自动化的处理,然后将处理的结果输出(到屏幕)的一种现代化的智能电子设备。
Q:如何知道当前使用的计算机上运行了哪些程序?
A:Windows系统使用任务管理器查看,macOS系统使用活动监视器查看。它们都可以查看进程(正在运行的程序)占用的CPU、内存、硬盘、网络等资源。
Windows11 任务管理器
macOS 活动监视器
1.2 常见的计算机
在日常生活中常见的手机、平板电脑和日常工作中常见的笔记本电脑、台式机、工作站都是属于计算机,不同类型的计算机其用途也是不一样的。
手机和平板电脑对于大部分人来说是娱乐设备,例如使用手机和平板电脑去听歌、打游戏、追剧、购物等等
手机-iPhone
平板电脑-iPad Pro
从事IT相关的工作(开发、测试、运维),那么关注的更多的是笔记本电脑或者是台式机,因为IT相关工作的具体内容就是去公司使用笔记本电脑或者是台式机来开发和维护项目的。
笔记本电脑-MacBook Pro
笔记本电脑-Alienware M18R1
台式机-Rog全家桶
工作站是一种高性能的计算机,它可以处理一些复杂和专业的任务,比如做AI训练、软件开发、影视后期、工业制造、建筑设计等等。因此一些需要高精度和高效率的工作领域,例如CAD专业人员,动画师,数据科学家,图形设计师,媒体制作团队等等会用工作站来完成他们的工作。
工作站-ThinkStation PX
Q:除了手机、平板电脑、笔记本电脑、台式机、工作站五种计算机以外,还有没有其他类型的计算机?
A:还有提供各种商业应用(电商、支付、物流、金融、社交)支撑的大型服务器集群(Server Cluster)。
服务器就是一台高配的计算机,服务器一般是放在机房的,机房一般是位于比较偏远的地方,例如腾讯和苹果的部分服务器就是放在贵州的大山里面,而互联网公司(百度、腾讯、阿里、美团、字节跳动、蚂蚁)一般会安排Linux运维工程师远程管理这些服务器
戴尔(DELL)PowerEdge R750 2U机架式服务器
Q:服务器的配置为什么会这么高?
A:服务器的用途:处理海量用户请求,存储和计算海量用户数据
服务器集群就是成千上万台(甚至几十万台)高配的计算机,具体服务器集群的数量和公司业务规模有关系,例如一些中小型公司没有物理服务器,直接购买阿里云、腾讯云、华为云的云服务器****。
谷歌、亚马逊、微软在全世界很多国家都有业务往来,服务器集群数量达到几十万台甚至上百万台。
从事IT相关的工作(开发、测试、运维),除了会使用笔记本电脑、台式机开发项目,项目开发完成后还会将项目部署到服务器对外提供服务,因此需要对服务器有个基本了解。
1.3 计算机的应用场景
在当今的社会,计算机(手机、平板电脑、笔记本电脑、台式机、工作站)几乎是无处不在的,是无所不能的,当拥有了一台计算机以后就可以使用计算机来解决在日常生活中和日常工作中的常见需求,其背后依赖的是计算机软硬件的共同协作来实现的。
想要使用某个软件之前需要去官网或者应用商店下载安装即可使用
有些电脑软件(例如京东、淘宝、爱奇艺)甚至不需要安装,只需要在浏览器的地址栏输入地址回车后即可使用
日常生活中的常见需求和软件解决方案
需求 | 软件解决方案 |
---|---|
社交 | 微信、QQ |
看电影、追剧 | 爱奇艺、优酷、腾讯视频 |
听歌 | QQ音乐、酷狗音乐、网易云音乐 |
购物 | 京东、淘宝 、拼多多 |
订机票、酒店 | 飞猪、美团、携程 |
订外卖 | 美团外卖、饿了么 |
打游戏 | 原神、王者荣耀 |
日常工作中的常见需求和软件解决方案
需求 | 软件解决方案 |
---|---|
办公 | 钉钉、企业微信、飞书 |
在线会议 | 腾讯会议、金山会议 |
收发邮件 | 个人:网易邮箱大师、QQ邮箱 企业:腾讯企业邮箱、钉钉邮箱 |
打车 | 滴滴打车、美团打车 |
看学习视频 | bilibili、慕课网、腾讯课堂、极客时间 |
技术分享 | Microsoft 365、WPS Office |
2.计算机核心硬件
2.1 计算机核心硬件-CPU
2.1.1 CPU基本介绍
CPU(Central Processing Unit) 中文就是中央处理器,有时候直接简称为处理器,或者叫做芯片。
CPU类似于人的大脑,CPU是计算机最核心的硬件。
CPU的好坏会直接影响整个计算机的硬件性能,内存和硬盘的好坏也会直接影响整个计算机的硬件性能,所以我们通常都会将CPU、内存、硬盘称为计算机的三大核心硬件。
Q:计算机除了三大核心硬件还有哪些其他的硬件设备?如果有的话通过什么工具查看硬件设备的配置
A:Windows通过鲁大师硬件参数查看,macOS通过Sensei仪表盘查看
鲁大师硬件参数
Sensei仪表盘
2.1.2 CPU主要组成
CPU主要是由运算器和控制器组成,运算器主要是负责数据的运算,控制器主要是负责控制其他计算机硬件设备的协同工作,控制器类似于交警,交警是用于指挥协调地面的交通。
CPU的三级缓存(L1 Cache,L2 Cache,L3 Cache)
2.1.3 CPU主要作用
CPU的主要作用就是用于执行计算机指令以及处理计算机软件的数据,每种CPU都是有自己的计算机指令系统,例如手机的CPU就是基于ARM架构的精简指令集,而PC(Windows系统的笔记本电脑、台式机)的CPU就是基于X86架构的复杂指令集,不同的计算机设备(手机、笔记本电脑)所使用的CPU可能不相同,计算机指令系统也不相同,这就是为什么手机上的程序不能直接在电脑上运行的本质原因。
2.1.4 主流计算机CPU
当我们从事开发或者是运维相关的工作以后,难免每天都会和计算机(服务器、PC)打交道,其中如果你是从事运维的工作那么和服务器打交道相对更多些,如果你从事开发(前端开发、后端开发)那么和PC打交道相对更多些。
主流服务器CPU厂商是Intel,主流的服务器(戴尔、联想、浪潮、超聚变)采用的CPU是Intel的至强可扩展处理器(第二代、第三代、第四代、第五代)
戴尔服务器
联想服务器
浪潮服务器
主流PC CPU厂商是Intel、AMD、Apple
Intel目前用于PC(台式机)性能最强的CPU型号是14900K,想要了解Intel CPU最新的相关信息访问Intel官方网站即可。
Apple目前用于PC(台式机 Mac Pro)的性能最强的CPU型号是M2 Ultra(2个M2 Max),想要了解Apple CPU最新的相关信息访问Apple官方网站即可。
2.2 计算机核心硬件-内存
2.2.1 内存基本介绍
内存是计算机的存储部件,内存也被称为内部存储器,CPU可以直接访问内存中的数据,而且读写的效率比较(和硬盘比较)高。
2.2.2 内存主要作用
-
内存用于暂时存储CPU运算的指令和数据,程序是由指令和数据组成的(程序是在内存中运行的)。例如微信程序的微信好友就是数据,而点击发送按钮给微信好友发送消息的背后就是一系列的指令,消息本身也是数据。
-
内存和硬盘等外部设备进行数据交换,例如使用程序将硬盘中的数据加载(读取)到内存中,或者使用程序将内存中的数据写入到硬盘。
2.2.3 内存分类
- 按照DDR代数分类:目前主流的DDR代数是DDR4和DDR5,其中DDR4的内存频率一般是在3600MHz左右,而DDR5的内存频率要更高一些,一般是4800MHz-6400MHz甚至更高(7200MHz、8000MHz)
内存的实际运行频率取决于CPU和主板
标配的运行频率和实际运行频率可能不一致
- 按照平台分类:笔记本电脑、台式机、服务器这三种计算机都是有内存,但是它们三者之间的内存是不通用的。
- 笔记本电脑内存
英睿达(Crucial)96GB(48GB×2)套装 DDR5 5600频率
- 台式机内存
- 服务器内存
三星 DDR5 64GB 4800MHz RECC 服务器内存
2.2.4 内存主要特点
-
内存的容量比较(和硬盘)小,单根容量一般是16GB-128GB,其中个人使用的笔记本电脑、台式机总内存容量通常都是16GB起步,最大可以达到192GB(48GB*4),而服务器总内存容量通常都是64GB起步,最大可以达到512GB甚至1TB-2TB,1TB=1024GB。
-
不能永久存储数据,一旦断电之后数据就会丢失
2.2.5 个人使用电脑如何防止数据丢失
数据是公司最宝贵的资源,在硬件层面和软件层面有很多方法防止数据丢失
以前个人在使用电脑的时候经常使用快捷键Ctrl+s/Command+s将数据保存到硬盘,从而实现数据的永久存储。
现在很多的软件提供了自动保存的功能,例如Typora,Visual Studio Code,IntelliJ IDEA等等,我们可以通过设置开启自动保存以后就能够实现将数据自动保存到硬盘。
Typora1.7.5设置自动保存
依次点击文件>偏好设置>文件,勾选自动保存
Visual Studio Code 1.85.1开启自动保存
依次点击 菜单栏的 File>Auto Save
勾选 Auto Save 就可以实现自动保存编辑的文件内容
2.3 计算机核心硬件-硬盘
2.3.1 硬盘基本介绍
硬盘是计算机的存储部件,硬盘也被称为外部存储器,CPU是不能直接访问硬盘中的数据的,如果想要CPU访问硬盘中的数据,那么我们就需要使用程序(操作系统)将硬盘中的数据加载(读取)到内存中,然后再提供给CPU访问。
Q:程序运行的基本流程是什么?操作系统以及CPU、内存、硬盘、网卡四大核心硬件各自发挥什么作用?
A: Windows环境下双击程序所在桌面的快捷方式之后,操作系统会根据快捷方式查找到对应可执行程序的硬盘路径,并将该硬盘路径下的可执行程序加载到内存中,并且会为其创建相应的进程。CPU从内存中读取该可执行程序的指令和数据并执行。如果该程序涉及到网络相关的操作,那么网络数据的收发由网卡完成。
我们以网易有道翻译为例介绍程序运行的基本流程以及在该过程中CPU、内存、硬盘、网卡四大核心硬件各自发挥什么作用
当前桌面有很多程序,实际上大部分程序都只是快捷方式
选中网易有道翻译,然后右键属性
在网易有道翻译 属性 面板中点击打开文件所在的位置
就可以查看到快捷方式对应可执行程序的路径C:\Users\liuguanglei\AppData\Local\youdao\dict\Application
网易有道翻译桌面的快捷方式对应的可执行程序路径就是C:\Users\liuguanglei\AppData\Local\youdao\dict\Application\YoudaoDict.exe
Windows下可执行程序是.exe结尾
当双击桌面的网易有道翻译快捷方式,操作系统会执行该快捷方式对应的可执行程序YoudaoDict.exe从硬盘加载到内存中,然后会为其创建进程,在任务管理器中可以查看到该进程以及该进程占用的CPU、内存、硬盘、网络资源。
CPU会从内存中读取网易有道翻译的指令和数据然后执行。
如果在网易有道翻译输入需要翻译的单词或者句子后点击查询,此时网卡会负责数据的收发
2.3.2 硬盘的特点
-
硬盘的容量比较大,通常都是TB(1TB=1024GB)级别的,例如单块硬盘的容量通常都是1TB,2TB,4TB,8TB,16TB等等
-
硬盘主要是用于永久存储数据的,内存中的数据断电后会丢失,但是硬盘中的数据断电后不会丢失。
2.3.3 硬盘分类
2.3.3.1 机械硬盘
机械硬盘容量大(TB级别),例如单块机械硬盘的容量通常都是1TB,2TB,4TB,8TB,16TB等等,价格比较便宜,读写速度比较慢(拷贝文件:50MB/s-100MB/s,实际速度取决于文件的数量)
机械硬盘拷贝文件
机械硬盘按照转速不同分类:
机械硬盘常见的转速有5400RPM,7200RPM,10000RPM,15000RPM,转速越高读写的速度就会越高。
-
5400RPM,7200RPM一般是普通家用、办公使用
-
7200RPM,10000RPM,15000RPM通常都是服务器使用
机械硬盘按照尺寸不同分类:2.5英寸和3.5英寸
2.3.3.2 固态硬盘
固态硬盘容量比较大(TB级别),例如单块固态硬盘的容量通常是1TB,2TB,4TB,8TB,价格比较贵,读写速度快(拷贝文件:500MB/s-3GB/s,实际速度取决于文件的数量),1GB=1024MB
固态硬盘拷贝文件
固态硬盘按照接口分类:分成M.2接口(NVMe协议)和M.2接口(SATA总线),其中NVMe协议又分成了PCIe3.0、PCIe4.0和PCIe5.0,目前主流的固态硬盘一般都是PCIe4.0
TiPlus7100系列 4TB
2.3.3.4 硬盘选型
因为机械硬盘体积大,读写速度慢,所以目前新出的笔记本电脑是无法使用机械硬盘的,不过如果是台式机或者是服务器可以同时使用机械硬盘和固态硬盘
一般情况下无论是个人还是企业对于硬盘的选型在满足性能要求的前提条件下考虑性价比,因此大部分场景下机械硬盘和固态硬盘混合使用。
例如个人在使用台式机时,系统盘使用固态硬盘,然后将操作系统、应用软件安装在系统盘中,这样开机快,软件运行速度也快,节省时间就是挣钱(时间就是金钱)。数据盘使用机械硬盘,然后将学习资源存放在数据盘,例如D盘、E盘、F盘中。
如果不考虑性价比,那么推荐全部使用固态硬盘。
2.4 计算机核心硬件-网卡
2.4.1 网卡基本介绍
网卡的名字有很多,在服务器领域经常会看到NIC(Network Interface Card),中文就是网络接口卡,简称为网卡,除此以外网卡也被称为以太网卡或者是网络适配器。
2.4.2 网卡的作用
网卡的作用就是用于将客户端和服务器相互连接的电路板组件。
客户端:发起请求的那一方,例如PC(笔记本电脑、台式机)上通常使用浏览器发起请求,移动设备(手机)上通常使用App发起请求
服务器:响应请求/处理请求的那一方,例如京东服务器/淘宝服务器等等
网卡的作用案例:使用浏览器客户端访问京东网站,访问京东网站就是访问京东服务器的那个京东网站程序
打开浏览器后,在浏览器的地址栏输入jd.com然后回车,浏览器客户端就会给京东服务器发送请求,请求的数据是京东网站首页。请求的数据是由网卡发送给京东服务器。
京东服务器收到浏览器后将京东网站首页的数据内容返回给浏览器客户端,返回的数据是由网卡接收,浏览器客户端负责渲染页面。
任务管理器中可以查看到浏览器占用的CPU、内存、硬盘、网络,此时只需要终端关注网络数据量的变化****。
2.4.3 网卡分类
常见网卡的分类方式有如下四种
-
网卡按照连接方式分类:分成有线网卡和无线网卡,有线网卡是通过网线或者是光纤将设备连接到网络,无线网卡通常是有一根或者多根小天线,利用无线电波和其他设备进行通讯。
-
网卡按照接口类型分类:分成PCI-E、USB
-
网卡按照端口类型分类:分成RJ-45端口网卡(笔记本电脑、台式机)和光端口(光口)网卡(服务器)
-
网卡按照连接速度分类:分成百兆网卡(100Mbps)、千兆网卡(1000Mbps、3000Mbps)、万兆网卡(10Gbps、25Gbps、40Gbps、100Gbps) 1Gbps=1000Mbps,10Gbps=10000Mbps
2.4.4 常见计算机网卡
个人使用的PC(笔记本电脑、台式机)一般是同时内置有线网卡和无线网卡两种网卡,其连接速度一般是千兆(1000Mbps、3000Mbps)左右
COMFAST AX200 台式机 PCI-E接口 无线网卡
COMFAST P25 V2 台式机 PCI-E接口 有线网卡
硬件参数-网卡
服务器一般内置的网卡都是有线网卡,连接速度一般都是万兆(10Gbps、25Gbps、40Gbps、100Gbps)
3.计算机软件
3.1 为什么会有软件
计算机软件有时候简称为软件
人们在日常生活中和工作中有各种各样的需求,例如社交、打车、旅游、办公(在线会议、收发邮件、在线文档)等等,正是由于有这些需求,因此有些人(老板)成立软件公司\互联网公司招聘一批程序员开发各种各样的软件。
软件出现的目的就是为了帮助人们更加方便地解决在日常生活中和工作中的常见需求。
比如以打车为例,在没有打车软件之前想要打车的话是需要自己去马路上招手叫车,有了打车软件(滴滴)以后首次使用只需要注册账号(一次),然后在软件上叫车即可,而且还可以通过打车软件支付打车费用。
软件的价值是远远超过硬件的价值的,例如抖音和微信的估值是几千亿人民币,因为其拥有海量用户(十亿级),可以产生巨大的商业价值。现在有越来越多的人从事软件相关的工作(开发、测试、运维),因为软件行业要比其它行业更好些,例如软件行业相对比较公平,在一线城市起步薪水10000(10k)以上月薪,一线大厂(BAT、ATM)工作3-5年以后可以拿到20000-50000(20k-50k)月薪。
3.2 软件组成
软件主要就是由一系列按照特定顺序组织的计算机指令和数据组成,除此以外还有一些其他的,例如设计文档、开发文档、用户使用手册等等。
-
计算机指令就是由程序员(开发者/软件工程师/开发工程师/码农/新型农民工)采用某种编程语言(C/C++/Java/JavaScript/Scala/Swift/Kotlin/Python/Go/Rust)编写的代码,代码最终会被编译器或者是解释器翻译成计算机指令,例如点击微信的发送按钮给微信好友发送消息的背后就是一系列的计算机指令。
-
数据就是由不同的业务场景产生的,例如微信的微信好友数据就是加好友产生的,微信的微信消息数据就是给微信好友发消息产生的。
3.3 软件分类
软件分成系统软件和应用软件两大类
3.3.1 系统软件
常见的系统软件有操作系统、语言处理程序、数据库、硬件驱动
3.3.3.1 操作系统
不管是服务器、还是PC以及手机都是有操作系统
- 服务器操作系统
服务器操作系统又叫做服务端操作系统,主流的服务器操作系统是Unix、Linux、Windows Server
Unix是最早出现的操作系统,采用C语言编写的,后来基于Unix发展出很多分支,例如IBM AIX、Sun Solaris、HP HP-UX等等
Linux是基于Unix,后来也发展出很多分支发行版本,例如CentOS、Ubuntu Server,主流互联网公司(百度、腾讯、阿里、美团、字节、蚂蚁)的服务器操作系统使用的几乎都是Linux
服务端操作系统-CentOS
服务端操作系统-Rocky Linux
服务端操作系统-Ubuntu Server
Windows Server是微软公司推出的企业版Windows,由于容易上手因此在一些中小型企业中使用。
- PC操作系统
PC指的就是个人电脑,包括笔记本电脑以及台式机
主流的PC操作系统或者叫PC端操作系统是Windows、macOS、Ubuntu Desktop
目前全世界使用人数最多的PC操作系统是Windows,包括Windows11、Windows10等等
Mac电脑(MacBook Pro, Mac Studio ,Mac Pro)标配的都是macOS系统,非常适合做软件开发。
Ubuntu Desktop顾名思义就是桌面版Ubuntu,有少部分人使用该系统做软件开发
- 移动端操作系统
移动端通常指的手机、手表、平板、车机等移动设备
主流的移动端操作系统是Android,iOS,鸿蒙OS
Android系统是全世界使用人数最多的手机操作系统,三星、小米、OPPO、VIVO都是使用Android系统
iOS系统是苹果手机(例如iPhone 15 Pro Max)操作系统
鸿蒙OS是华为推出的分布式操作系统,支持手机、手表、平板、车机、智慧屏
我们前期在学习项目开发大部分时间都会使用Windows或者macOS
项目测试、部署时会使用Linux,例如CentOS或者是Ubuntu Server
3.3.1.2 语言处理程序
语言指的是编程语言或者是计算机语言,常见的语言处理程序有编译器和解释器。
例如C语言编写的C程序需要通过编译器编译后再运行,Python编写的Python程序需要经过Python解释器边解释边运行
3.3.1.3 数据库
数据库是用于存储海量用户数据,常见的数据库有关系型数据库MySQL、PostgreSQL、Oracle等等,常见的NoSQL数据库有Redis、MongoDB等等。
3.3.1.4 硬件驱动
计算机硬件设备通常是要安装对应的驱动程序才能使用,例如想要上网除了有网卡还要安装网卡驱动,想要使用打印机还需要安装对应的打印机驱动,想要玩游戏也需要对应的显卡驱动。
3.3.2 应用软件
在日常办公时我们会使用到非常多的应用软件,而且绝大部分应用软件既有Windows版本,又有macOS版本。
Windows常用应用软件
macOS常用应用软件
我们以后在下载和安装软件时需要根据所使用操作系统的版本来选择对应的软件版本
3.4 软件交互方式
运行在不同操作系统上的软件交互方式是不一样的,使用的人群也是不一样的。
- 服务端操作系统(Unix/Linux)的软件交互方式是基于命令行(Command Line Interface CLI)的字符界面,主要是提供给程序员/Linux运维工程师使用的。
- PC端操作系统(Windows,macOS)的软件交互方式是基于鼠标键盘的图形化界面(Graphical User Interface GUI),主要是提供给程序员/Linux运维工程师/普通人使用的。
- 移动端操作系统(Android,iOS/iPadOS,鸿蒙OS)的软件交互方式是基于手势触控(滑动)、语音的图形化界面,主要是提供给程序员(Android工程师,iOS工程师)/普通人使用
4.计算机系统
4.1 计算机系统组成
计算机系统是由计算机硬件系统和计算机软件系统两部分组成
4.1.1 计算机硬件系统
计算机硬件系统是由CPU、内存、硬盘、网卡、主板、输入输出设备等组成,常见的输入设备是鼠标、键盘,常见的输出设备是声卡、显卡、显示器,其中键盘叫做标准输入设备,显示器叫做标准输出设备。
从事开发或者是运维相关的工作,那么需要重点关注CPU、内存、硬盘、网卡四大核心硬件。
因为在开发项目的过程中可能会遇到某些错误,这些错误可能是业务问题,例如开发电商系统时通常会有订单金额计算业务,如果没有搞清楚订单金额计算规则,那么就可能导致订单金额计算错误,也可能是因为项目的某些错误导致计算机硬件相关的问题。
- CPU高负载
- 内存溢出
- 硬盘写满
- 网络不通
4.1.2 计算机软件系统
计算机软件系统是由系统软件和应用软件组成
从事开发或者是运维相关的工作,那么需要重点关注操作系统,操作系统在计算机系统中的地位非常重要,操作系统既要给系统软件和应用软件提供运行平台,还要负责和底层计算机硬件设备进行交互。
4.2 计算机系统体系结构
-
软件(Software)是运行在硬件(Hardware)之上
-
无论是系统软件还是应用软件都是运行在操作系统(Operating System)之上
-
操作系统(例如Linux)主要是由内核(Kernel)和外壳(Shell)两部分组成,内核(Kernel)主要是负责和计算机硬件设备进行交互,外壳(Shell)主要是负责和用户(程序员/Linux运维工程师)进行交互。Shell可以有多种实现,例如bash,csh,zsh等等,其中CentOS默认是bash,macOS默认是zsh。Linux命令都是提交给Shell执行的,Shell也是一门脚本语言,通过Shell编程实现自动化运维。
5.计算机常用单位
5.1 计算机常用容量单位
5.1.1 计算机常用容量单位介绍
计算机常用的容量指的就是内存容量和硬盘容量,例如2023款16英寸MacBook Pro最高可以选择128GB统一内存以及8TB固态硬盘
这里的GB、TB都是容量单位
但是在物理层面,我们使用高低电平来记录信息的,通常都是使用高电平表示1,低电平表示0
因此在计算机底层只能识别0和1两种状态,但是0和1能够表示的信息太少了,因此我们需要更大的容量单位。
常用的容量单位以及使用场景(从小到大排序)
容量单位 | 使用场景 |
---|---|
位(bit) | 计算机最小的容量单位,只能存储0或者1,通常用于门电路 |
字节(Byte) | 计算机最基本的容量单位(计算机中实际使用的最小单位),通常用于表示文件大小、网络传输(上传文件、下载文件) |
千字节(KB) | 通常用于表示文件大小、网络传输(上传文件、下载文件) |
兆字节(MB) | |
吉字节(GB) | 通常用于表示文件大小、内存、硬盘的容量 |
太字节(TB) | 通常用于表示服务器内存、硬盘的容量 |
拍字节(PB) | 通常用于表示大数据系统处理的数据容量 |
艾字节(EB) | 通常用于表示互联网大厂(百度、腾讯、阿里、美团、字节跳动、蚂蚁)的区域数据中心的总容量 |
它们的换算关系如下所示
1EB=1024PB
1PB=1024TB
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024Byte
1Byte=8bit
5.1.2 计算机常用容量单位使用
为什么我买的4TB硬盘的实际总容量没有4TB,只有3.63TB左右?
计算机中的4TB容量换算成字节
4TB=4*1024*1024*1024*1024Byte
硬盘厂商的4TB容量换算成字节
4TB=4*1000*1000*1000*1000Byte
以上看出计算机容量单位是以1024 进行换算的,但是硬盘厂商(希捷、西部数据、三星、金士顿)是以1000进行换算的
因此4TB硬盘的实际可用容量
4*1000*1000*1000*1000/1024/1024/1024/1024≈3.63TB
2T的固态硬盘实际可用容量也只有1.86TB左右
5.2 计算机常用速度单位
5.2.1 网络速度单位
网络速度简称网速
常用的网速单位是Mbps,Mbps是megabits per second的缩写,是一种传输速率单位,指每秒传输的位(比特)数量。1Mbps代表每秒传输1,000,000位(bit),计算机中实际使用的最小容量单位是字节,因此需要将位(比特)转换成字节,即每秒传输的数据量为:1,000,000/8=125,000Byte/s。
宽带运营商(电信、移动、联通)声称的百兆带宽也就是100Mbps,但是100M带宽的峰值下载速度也就是10MB/s左右,它们的换算关系就是100Mbps/8=12.5MB/s,1Byte=8bit
如果想要获取宽带的网速,那么使用网速管家测试网速,测试结果仅供参考
5.2.2 CPU速度单位
CPU的速度一般是由CPU的时钟频率体现的,而时钟频率的单位就是赫兹(Hz),而目前主流CPU的时钟频率一般都是在2GHz以上,赫兹(Hz)就是秒分之一,也就是每秒钟的周期性变动重复次数的计量。
不过在早期CPU的速度是经历KHz、MHz逐步发展的,GHz、MHz、KHz、Hz的换算关系如下所示
1KHz=1000Hz
1MHz=1000KHz
1GHz=1000MHz
假设你的台式机CPU是14900K,那么它睿频频率最高是6GHz
6GHz转换成Hz
6GHz=6*1000*1000*1000Hz= 6 000 000 000Hz
也就意味着6GHz的CPU每秒钟可以变化60亿次
Windows中可以通过任务管理器中查看CPU的速度,不同的CPU速度是不一样的。
6.推荐给开发者的计算机
6.1 选购计算机的原则
想要成为一名开发者/程序员之前需要学习很多相关的技术,而这些技术都是需要高配置的计算机硬件提供支撑的,因此建议大家在选购电脑时通常选择新款、高配置的笔记本电脑。
例如在自学Java、前端、大数据时建议购买一台笔记本电脑,另外再加一台显示器,这样可以边看视频或者看文档学习边写代码。
6.2 Windows笔记本电脑
华硕天选4笔记本电脑参考配置
6.3 苹果笔记本电脑
苹果笔记本电脑参考配置
6.4 显示器
显示器可以选择戴尔或者是你喜欢的其他品牌
显示器参考配置
7.计算机语言
7.1 什么是计算机语言
语言是人和人之间进行沟通交流的一种表达方式,例如中国人和中国人之间使用汉语进行沟通交流,而中国人和美国人之间使用汉语或者使用英语进行沟通交流,但是沟通交流的前提条件就是必须要使用沟通双方都能够理解的语言。
计算机语言是人(程序员)和计算机进行沟通交流的一种表达方式。程序员可以使用计算机语言对计算机下达命令,让计算机完成程序员需要的功能。
计算机语言有时候也被称为编程语言,因为学习计算机语言的目的就是为了编程(写代码、写程序、开发项目)
计算机语言有很多种,每年都会出现一些新的计算机语言,但是主流的计算机语言只有20多种,例如C/C++/Java/JavaScript/Scala/Swift/Kotlin/Python/Go/Rust等等,如果你想要成为一名程序员,就需要系统、深入地掌握其中的一到两种语言。这些语言都有很多类似的地方,当你掌握其中一种语言后,可以快速地掌握其他类似的语言。
7.2 计算机语言发展史
任何事物都是从无到有逐渐发展壮大起来的,计算机语言也是一样的。
计算机语言的发展经历了机器语言、汇编语言、高级语言(高级程序设计语言、高级编程语言、高级计算机语言)三个阶段,其特点就是让程序的开发、测试、部署变得越来越高效、简单、方便,不过是以牺牲了程序的运行效率(性能)作为代价的,但是随着计算机硬件的高速发展(摩尔定律:每18-24个月,再在价格不变的情况下,计算机性能会翻倍),在绝大多数场景下程序运行效率(性能)的损失是可以忽略不计的。
- 第一代计算机语言-机器语言
在计算机发展的早期,程序员采用二进制的机器指令(1000111001001100)来编写程序,每种CPU都是有各自不同的指令系统,例如x86,ARM等等,这样导致同一个程序在不同的机器上需要使用不同的机器语言,也就意味着面向机器编写的程序是不能够移植的,需要手动处理底层硬件的差异性。而且二进制的机器指令编写的程序是难以理解和维护的,但是机器语言编写的程序的运行效率(性能)是最高的,因为计算机可以直接识别二进制的机器指令。
- 第二代计算机语言-汇编语言
随着计算机技术的高速发展,后来汇编语言和汇编器的出现解决了机器语言需要记住非常多的机器指令,也就是将机器指令转换成了人类更加容易理解和记忆的英文单词(例如MOV,AX,BX),然后由汇编器将英文单词编译成机器指令,因为计算机最终只能够识别二进制的机器指令。
汇编语言也是面向机器的,不同机器的汇编指令也是不一样的,汇编语言编写的程序也是不能移植的。但是尽管如此,汇编语言在工业电子编程、软件的加密解密、计算机病毒分析等场景中广泛使用。
- 第三代计算机语言-高级语言
高级语言的高级之处体现在程序员在编写代码的时候不需要关注底层硬件的差异性,而只需要关注实现的业务功能即可。高级语言编写的程序是需要通过编译器编译后再运行或者是通过解释器边解释边运行,而且相比机器语言、汇编语言而言,高级语言更加容易学,因此会有更加充足的人力资源(程序员)来开发大型的商业软件。
高级语言分类
高级语言按照编程思想分类:分成面向过程和面向对象两大类,例如C语言就是面向过程的高级语言,而Java,Python、Go等等都是面向对象的高级语言
高级语言按照运行机制分类:分成编译型和解释型两大类,例如C、C++、Swift是编译型语言,Python、Ruby、JavaScript是解释型语言,Java是混合型:既有编译,又有解释。
编译型:编译的含义指的是编译型语言编写的源程序使用编译器一次性翻译成特定平台的机器指令**。**
编译型语言的特点是性能更高,但是通常不能跨平台。
解释型:解释的含义指的是解释型的语言编写的源程序使用解释器逐行边解释边运行****。
解释型语言的特点是性能略低,但是通常可以跨平台。
三代计算机语言的主要特点汇总
计算机语言 | 开发效率排行榜 | 运行效率(性能)排行榜 | 程序可维护性排行榜 | 程序是否可以移植 | 学习难度 |
---|---|---|---|---|---|
第一代计算机语言-机器语言 | 第3名 | 第1名 | 第3名 | 否 | ★★★★★ |
第二代计算机语言-汇编语言 | 第2名 | 第2名 | 第2名 | 否 | ★★★★ |
第三代计算机语言-高级语言 | 第1名 | 第3名 | 第1名 | 是 | ★★★ |
目前大部分人学习计算机语言时通常都是选择第三代计算机语言-高级语言,例如Java,Python,Go,JavaScript,C/C++等等,很少有人选择机器语言和汇编语言。
7.3 计算机语言排行榜
如果现在想要知道这些计算机语言的活跃程度排名,那么可以访问TIOBE Index
2023年 12月计算机语言排行榜前20名(每个月会更新一次)
目前排名第一的是Python,Python是由于人工智能火起来的,但是人工智能的门槛非常高,例如学历必须是计算机相关专业的硕士、博士,而且人工智能的学习难度非常高,尤其是对数学的要求比较高,因此对于大部分人来说都不太适合做人工智能的开发。
紧随其后的就是C、C++和Java
从TIOBE提供的计算机语言历史走势图可以看出,从2002年到2022年大部分时间都是C和Java轮流做老大(排名第一)
7.4 计算机语言使用场景
每一种计算机语言都是有自己擅长的使用场景(开发方向),大家如果想要从事软件开发行业,那么就应该根据市场的需求再结合自己的喜好选择对应的计算机语言。
高级计算机语言应用场景
高级计算机语言 | 应用场景 |
---|---|
C | 操作系统(Unix/Linux/Windows/macOS/Android,iOS,鸿蒙OS)、硬件驱动、中间件(Redis,Nginx)、嵌入式 |
C++ | 大型应用软件(PhotoShop、Office、Chrome)、网络通讯、科学计算、 游戏引擎(Unity 3D)、中间件(MySQL、JVM)、人工智能 |
C# | Windows应用、Web应用、游戏开发 |
Java | 大型分布式系统后台(淘宝、天猫、支付宝、菜鸟物流)、Android App 、大数据开发(Hadoop、HBase、Zookeeper、ElasticSearch)、中间件(RocketMQ、Sharding-Sphere) |
Go | 云计算(Docker、Kubernates、Prometheus)、大型分布式系统(高并发)、爬虫、大数据、人工智能 |
Objective-C/Swift | iOS应用、iPadOS应用、macOS应用 |
Python | Web开发(Django)、人工智能(TensorFlow、PyTorch)、爬虫(Scrapy)、自动化测试、自动化运维(Ansible)、数据分析(Pandas)、大数据(PySpark)、科学计算(NumPy) |
JavaScript | Web前端、服务端(Node.js)、PC端(Electron) |
Scala | 大数据(Kafka) |
Kotlin | Android App |
7.5 我该选择哪种计算机语言
没有最好的计算机语言,只有在特定场景下相对最合适的计算机语言而已,因为这些语言创造出来的目的就是为了解决某个场景的需求,但是无法解决所有需求。
如果你想要找个高薪工作(15k-30k),那么建议系统、深入地学习Java语言以及Java开发相关类库、框架、中间件、基础架构等内容。
因为Java相比C/C++而言,上手比较容易,而且功能非常强大,无论是大型分布式系统的后台还是大数据或者是Android App、中间件都可以使用Java语言来开发。
目前在招聘市场中Java的需求一直都是比较旺盛的,大家可以通过访问招聘网站(Boss直聘、拉勾、前程无忧)去搜索Java相关的岗位来了解具体的岗位要求(学历要求、技术要求、项目经验要求)。
-
中国有51%的程序员使用Java,这个比例全球最高
-
Java开发人员最多的地方是亚洲,大约有250万的开发人员使用Java作为他们的主要编程语言,全世界大概有680万
上海得物 Java
上海拼多多 Java
上海钧正网络科技 Java
杭州阿里巴巴 Java
8.计算机进制
8.1 计算机进制介绍
8.1.1 什么是进制
进制是一种计数的方式,也称为进位计数法或者位值计数法,进制使用有限的数字符号表示无限的数值,使用的数字符号的数量称为这种进制的基数或者是底数,例如十进制就是由0-9之间的十个数字组成的。
相同进制类型的数据在进行运算的时候会遵守:加法:逢R进1,减法:借1当R,这里的R表示进制
8.1.2 四种常用计算机进制
计算机中常用的进制包括十进制、二进制、八进制和十六进制
8.1.2.1 十进制
十进制的使用场景:生活中使用最多的一种进制,例如账户余额,开发人员的薪水等等都是用十进制表示。
十进制的组成和示例:由0~9之间的十个数字组成,例如100,1234等等都是十进制的整数,因为整数默认就是十进制
十进制的运算规则:加法:逢十进一 减法:借一当十
十进制的位权:从右往左依次是 10^0、10^1、10^2、10^3、10^4、10^5、10^6、10^7
等等
8.1.2.2 二进制
二进制的使用场景:在计算机中常见的数据有文本、图片和声音,文本包含了数字、字母和汉字,视频是由图片和声音组成。而计算机中任意数据(文本、图片、声音)都是以二进制的形式存储。
二进制的组成和示例:二进制是以0b或者0B开头, 由0和1两个数字组成,例如0b00001010
二进制相比于八进制和十六进制表示数据太长,不方便阅读。
二进制的运算规则:加法:逢二进一 减法:借一当二
二进制的位权:从右往左依次是2^0、2^1、2^2、2^3、2^4、2^5、2^6、2^7
等等
8.1.2.3 八进制
八进制的使用场景:Linux权限系统采用八进制
八进制的组成和示例:八进制是由0~7之间的八个数字组成,每1个八进制位对应3个二进制位,八进制的整数通常是以0开头,例如017
八进制的运算规则:加法:逢八进一 减法:借一当八
八进制的位权:从右往左依次是8^0、8^1、8^2、8^3、8^4、8^5、8^6、8^7
等等
8.1.2.4 十六进制
十六进制的使用场景:内存地址、MAC地址、IPV6地址都是采用十六进制
十六进制的组成和示例:十六进制是由0~9之间的十个数字和a~f或者是A-F之间的6个字母
组成,依次表示10,11,12,13,14,15,每1个十六进制位对应4个二进制位,十六进制的数字通常以0x或者0X开头,例如0x1F,0X12a等等
十六进制的运算规则:加法:逢十六进一 减法:借一当十六
十六进制的位权:从右往左依次是16^0、16^1、16^2、16^3、16^4、16^5、16^6、16^7
等等
8.1.3 十进制、二进制、八进制、十六进制的换算关系
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | a或A |
11 | 1011 | 13 | b或B |
12 | 1100 | 14 | c或C |
13 | 1101 | 15 | d或D |
14 | 1110 | 16 | e或E |
15 | 1111 | 17 | f或F |
16 | 10000 | 20 | 10 |
8.2 原码、反码、补码
Q:为什么要学原码、反码、补码
A:理解关于整数的数据存储、数据类型转换、位运算的底层原理
8.2.1 原码
8.2.1.1 原码介绍
原码:十进制数据的二进制表现形式,最左边是符号位,0为正数,1为负数
例如56 转换成二进制 0011 1000 ,其中最左边的0表示符号位,其他的011 1000 表示数据
在计算机中,比特位(bit)存储的数据就是0或者1,但是比特位(bit)能存储的数据太少了,因此将8个位(bit)组成1个字节(Byte),即1Byte=8bit,字节(Byte)是计算机最基本的容量单位(计算机中实际使用的最小单位)。
Q:原码一个字节的取值范围是什么?
A:-127 ~ +127
原码一个字节(Byte)能存储的最大值是二进制的0111 1111,转换为十进制结果是+127
原码一个字节(Byte)能存储的最小值是二进制的1111 1111,转换为十进制结果是 -127
-127到+127 一共256个数字,因为0有+0和-0
一个字节原码的取值范围
十进制数字 | 原码 |
---|---|
+127 | 0111 1111 |
… | … |
+4 | 0000 0100 |
+3 | 0000 0011 |
+2 | 0000 0010 |
+1 | 0000 0001 |
+0 | 0000 0000 |
-0 | 1000 0000 |
-1 | 1000 0001 |
-2 | 1000 0010 |
-3 | 1000 0011 |
-4 | 1000 0100 |
… | … |
-126 | 1111 1110 |
-127 | 1111 1111 |
8.2.1.2 原码数值计算
8.2.1.2.1 原码正数数值计算
利用原码在进行计算的时候,如果是正数则完全没有问题。
原码的正数计算案例:依次使用原码计算0+1、1+1、2+1、3+1、4+1
- 使用原码计算0+1
-
0原码是0000 0000
-
1原码是 0000 0001
0000 0000 +0000 0001 = 0000 0001
0000 0001转换成十进制是1
- 使用原码计算1+1
-
1原码是0000 0001
-
1原码是0000 0001
0000 0001 +0000 0001 = 0000 0010
0000 0010转换成十进制是2
- 使用原码计算2+1
-
2原码是0000 0010
-
1原码是0000 0001
0000 0010 +0000 0001 = 0000 0011
0000 0011转换成十进制是3
- 使用原码计算3+1
-
3原码是0000 0011
-
1原码是0000 0001
0000 0011 +0000 0001 = 0000 0100
0000 0100 转换成十进制是4
- 使用原码计算4+1
-
4原码是0000 0100
-
1原码是0000 0001
0000 0100 +0000 0001 = 0000 0101
0000 0101 转换成十进制是5
8.2.1.2.2 原码负数数值计算
原码的弊端:利用原码在进行计算的时候,如果是负数计算结果就会出错,实际运算的方向和正确的运算方向是相反的。
原码的负数计算案例:依次使用原码计算-0+1、-1+1、-2+1
- 使用原码计算-0+1
-
-0原码是1000 0000
-
1原码是 0000 0001
1000 0000 +0000 0001 = 1000 0001
1000 0001 转换成十进制实际值是-1,但正确值应该是1 因为-0 + 1 = 1
- 使用原码计算-1+1
-
-1原码是1000 0001
-
1原码是0000 0001
1000 0001 +0000 0001 = 1000 0010
1000 0010 转换为十进制实际值是-2,但是正确值应该是0 因为-1 + 1 = 0
- 使用原码计算-2+1
-
-2原码是1000 0010
-
1原码是0000 0001
1000 0010 +0000 0001 = 1000 0011
转换成十进制实际值是-3,但正确值应该是-1 因为-2 + 1 = -1
8.2.2 反码
8.2.2.1 反码介绍
反码的出现是为了解决原码不能计算负数的问题而出现的
反码的计算规则
①正数的反码是其本身(原码),因为原码正数计算没有问题。
②负数的反码是原码的基础上符号位保持不变,数据位取反,即0变1,1变0。
Q:已知原码,如何求反码?
A:以负数-56为例
-
56的原码是 0011 1000
-
-56的原码是 1011 1000
-
-56的反码是 1100 0111
8.2.2.2 反码数值计算
反码的弊端:负数运算的时候,如果结果不跨0是没有任何问题,但是如果结果跨0跟正确结果会有1的偏差
- 使用反码计算-56 + 1 正确值应该是-55
-
-56的原码是1100 0111
-
1的原码是0000 0001
1100 0111 +0000 0001 = 1100 1000
-
55的原码是 0011 0111
-
-55的原码是1011 0111
-
-55的反码是1100 1000
上面的计算结果1100 1000 刚好和-55的反码1100 1000是一样的
因此看起来反码似乎解决了原码不能计算负数的问题
但是我们再看一些反码的数值计算案例
首先使用表格汇总-1~-7的原码和反码
十进制数字 | 原码 | 反码 |
---|---|---|
-1 | 1000 0001 | 1111 1110 |
-2 | 1000 0010 | 1111 1101 |
-3 | 1000 0011 | 1111 1100 |
-4 | 1000 0100 | 1111 1011 |
-5 | 1000 0101 | 1111 1010 |
-6 | 1000 0110 | 1111 1001 |
-7 | 1000 0111 | 1111 1000 |
- 使用反码计算 -4 + 1 正确值应该是-3,实际值是-3
-
-4的反码是1111 1011
-
1的反码是0000 0001
1111 1011 + 0000 0001 =1111 1100
-3的反码就是1111 1100
上面的计算结果1111 1100 刚好和-3的反码1111 1100是一样的,因此计算正确
- 使用反码计算 -4 - 1 正确值应该是-5,实际值是-5
-
-4的反码是1111 1011
-
1的反码是0000 0001
1111 1011 - 0000 0001 =1111 1010
-5的反码就是1111 1010
上面的计算结果1111 1010 刚好和-5的反码1111 1010是一样的,因此计算正确
- 使用反码计算-3+1 正确值应该是-2 ,实际值是-2
-
-3的反码是1111 1100
-
1的反码是0000 0001
1111 1100+0000 0001=1111 1101
-2的反码就是1111 1101
上面的计算结果1111 1101 刚好和-2的反码1111 1101 是一样的,因此计算正确
- 使用反码计算-2+1 正确值应该是-1,实际值是-1
-
-2的反码是1111 1101
-
1的反码是0000 0001
1111 1101+0000 0001=1111 1110
-1的反码就是1111 1110
上面的计算结果1111 1110 刚好和-1的反码1111 1110 是一样的,因此计算正确
- 使用反码计算-1+1 正确值应该是0,实际值是-0
-
-1的反码是1111 1110
-
1的反码是0000 0001
1111 1110 + 0000 0001 = 1111 1111
-0的反码就是1111 1111,1111 1111对应的原码是1000 0000,转换成十进制就是-0
十进制数字 | 原码 | 反码 |
---|---|---|
-0 | 1000 0000 | 1111 1111 |
上面的计算结果1111 1111 刚好和-0的反码1111 1111 是一样的,因此计算正确
- 采用反码计算-0+1 期望的结果是1,实际的结果是0
-
-0的反码是1111 1111
-
1的反码是0000 0001
1111 1111+ 0000 0001 =1 0000 0000
**反码计算-0+1的计算结果是1 0000 0000,但是现在只有一个字节,根据1Byte=8bit,也就是只会保留右边的八位,也就是0000 0000,而最左边的1被截断(舍弃),因此最终的结果是0000 0000,最左边的符号位是0,因此表示正数,即原码和反码一样也是0000 0000,转换成十进制是+0,**因此计算正确
十进制数据 | 原码 | 反码 |
---|---|---|
+0 | 0000 0000 | 0000 0000 |
这里就会发现当利用反码进行数值计算时,如果结果跨0时计算结果就会有误差。
继续再看一些反码数值计算的案例
- 使用反码计算-5+2 正确值是-3,但是实际值是-3
-
-5的反码是1111 1010
-
2的反码是0000 0010
1111 1010+0000 0010=1111 1100
-3的反码就是1111 1100
上面的计算结果1111 1100 刚好和-3的反码1111 1100是一样的,因此计算正确
- 使用反码计算-5+6 正确值是1,但是实际值是0
-
-5的反码是1111 1010
-
6的反码是0000 0110
1111 1010+0000 0110= 1 0000 0000
反码计算-5+6的计算结果是1 0000 0000,但是由于只有一个字节,根据1Byte=8bit,也就只会保留右边的八位,也就是0000 0000,而最左边的1被截断(舍弃),因此最终的结果是0000 0000,最左边的符号位是0,因此表示正数,即原码和补码一样也是0000 0000,转换成十进制就是0
- 采用反码计算-4 + 7 期望的结果是3,实际的结果是2
-
-4的反码是1111 1011
-
7的反码是0000 0111
1111 1011+ 0000 0111 = 1 0000 0010
反码计算-4 + 7的计算结果是1 0000 0010,但是由于只有一个字节,根据1Byte=8bit,也就是只会保留右边的八位,也就是 0000 0010,而最左边的1被截断(舍弃),因此最终的结果是0000 0010,最左边的符号位是0,因此表示正数,即原码和反码一样也是0000 0010,转换成十进制就是2
结论:由于在反码中0的表示有两种表示方式:0000 0000和1111 1111,因此在负数计算的时候可能会有误差。例如-5 + 6,-4 + 7等等
-7~+0 之间的原码和反码
十进制数字 | 原码 | 反码 |
---|---|---|
+0 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 |
-1 | 1000 0001 | 1111 1110 |
-2 | 1000 0010 | 1111 1101 |
-3 | 1000 0011 | 1111 1100 |
-4 | 1000 0100 | 1111 1011 |
-5 | 1000 0101 | 1111 1010 |
-6 | 1000 0110 | 1111 1001 |
-7 | 1000 0111 | 1111 1000 |
8.2.3 补码
8.2.3.1 补码介绍
补码出现的目的就是为了解决负数计算时跨0的问题而出现的
补码的计算规则:
①正数的补码不变,正数的原码、反码、补码都是一样的
②负数的补码是在反码的基础上加1,另外补码还能多记录一个特殊的值-128,该数据在1个字节下没有原码和反码。
补码的注意事项:计算机中数据的存储和运算都是以补码的形式进行的。
负数的补码和反码的换算
补码=反码+1
反码=补码-1
补码完美解决了计算机中正数和负数的计算问题,因此在计算机中数据的存储、运算都是采用补码的形式来进行的。
-7~0的原码、反码、补码
十进制数字 | 原码 | 反码 | 补码 |
---|---|---|---|
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 0000 0000 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
-4 | 1000 0100 | 1111 1011 | 1111 1100 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 |
-6 | 1000 0110 | 1111 1001 | 1111 1010 |
-7 | 1000 0111 | 1111 1000 | 1111 1001 |
8.2.3.2 补码数值计算
- 使用补码计算-4 +2 (没有跨0)正确值是-2,实际值也是-2,-2的补码是1111 1110
-
-4的补码是1111 1100
-
2的补码是0000 0010
1111 1100+ 0000 0010= 1111 1110
- 使用补码计算-4 +5(跨0) 期望结果是1,实际结果是1,1的补码是0000 0001
-
-4的补码是1111 1100
-
2的补码是0000 0010
1111 1100 + 0000 0101=1 0000 0001
补码计算-4 +5的计算结果是1 0000 0001,但是由于只有一个字节,根据1Byte=8bit,也就是只会保留右边的八位,也就是0000 0001,而最左边的1被截断(舍弃),因此最终的结果是0000 0001,最左边的符号位是0,因此表示正数,即反码和补码一样也是0000 0001,转换成十进制就是1
8.2.4 原码、反码、补码相互转换
Q:为什么原码、反码、补码需要相互转换
A:计算机在存储以及执行运算的时候使用补码运算,当我们查看计算机执行结果的时候使用原码
原码、反码、补码的相互转换规则
-
正数的原码、反码、补码都一样
-
负数的原码求补码:① 原码的最高位(符号位)不变,其他位取反得到反码。②反码加1得到补码
-
负数的补码求原码:① 补码减1得到反码 ② 反码的最高位(符号位)不变,其他位(数据位)取反得到原码
案例1:求-14的补码
计算器验证结果
案例2:根据-14的补码1111 0010求原码
8.2.5 一个字节取值范围的原码、反码和补码
十进制数字 | 原码 | 反码 | 补码 |
---|---|---|---|
+127 | 0111 1111 | 0111 1111 | 0111 1111 |
… | … | … | … |
+4 | 0000 0100 | 0000 0100 | 0000 0100 |
+3 | 0000 0011 | 0000 0011 | 0000 0011 |
+2 | 0000 0010 | 0000 0010 | 0000 0010 |
+1 | 0000 0001 | 0000 0001 | 0000 0001 |
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 0000 0000 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
-4 | 1000 0100 | 1111 1011 | 1111 1100 |
… | … | … | … |
-126 | 1111 1110 | 1000 0001 | 1000 0010 |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-128 | 无 | 无 | 1000 0000 |
为什么一个字节的取值范围是-128~+127
-
1Byte=8bit,每个比特位可以表示0或者1,因此1个字节可以表示256(2^8)个数字
-
补码中的0只有一种表示方式,即0000 0000,因此空出来一个位置,用于表示10000 0000,该二进制数规定为128的补码
一个字节补码的取值范围是1000 0000~0111 1111,转换成十进制就是-128~127
8.3 计算机进制转换
8.3.1 正整数的进制转换
8.3.1.1 正整数的任意进制转十进制
1234=1*10^3 + 2*10^2 + 3*10^1+ 4*10^0=1000+200+30+4=1234
正整数的任意进制转十进制公式:系数*基数的权次幂相加
-
系数:就是每一位上的数
-
基数:当前进制数,例如将二进制转换为十进制,那么基数就是2
-
权:从右往左依次是0,1,2,3,4,5,6,7,…依次递增
案例1:将二进制101转换为十进制
101 = 1 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0 = 4 + 0 + 1 = 5
因此正整数的二进制101转换为十进制结果就是5
案例2:将正整数的二进制10101转换为十进制
因此正整数的二进制10101转换为十进制结果就是21
案例3:将正整数的八进制101转换为十进制
因此正整数的八进制101转换为十进制结果就是65
案例4:将正整数的十六进制abc转换为十进制
正整数的十六进制abc转换为十进制的结果就是2748
计算器验证结果
8.3.1.2 正整数的十进制转任意进制
正整数的十进制转任意进制规则:除基取余法,即不断地除以基数(几进制,基数就是几)得到余数,直到商数为0,再将余数倒着拼接起来即可。
案例1:将十进制的正整数89转换为二进制
十进制的正整数89转换为二进制的结果是1011001
计算器验证结果
案例2:将十进制的正整数89转换为八进制
十进制的正整数89转换为八进制的结果是131
计算器验证结果
8.3.1.3 正整数的八进制、十六进制转二进制
8.3.1.3.1 正整数的八进制转二进制
正整数的八进制转二进制的规则:将八进制数的每1位数,转换成对应的一个3位的二进制数
案例:将八进制的0357转换为二进制
八进制的0357转换为二进制的结果是 1110 1111
计算器验证转换结果
8.3.1.3.2 正整数的十六进制转二进制
正整数的十六进制转二进制的规则:将十六进制数的每1位数,转换成对应的一个4位的二进制数
案例:将正整数的十六进制0x23B转换为十进制
十六进制的0x23b转换为十进制的结果是0010 0011 1011
计算器验证转换结果
8.3.1.4 正整数的二进制转八进制、十六进制
8.3.1.4.1 正整数的二进制转八进制
正整数的二进制转八进制的规则:从最右边的低位开始,将二进制数每三位一组,转换成对应的八进制数,不足三位补充0
案例:将0100 1110转换为八进制
二进制0100 1110转换为八进制的结果是116
计算器验证结果
8.3.1.4.2 正整数的二进制转十六进制
正整数的二进制转十六进制的规则:从最右边的低位开始,将二进制数每四位一组,转换成对应的十六进制数,不足四位补充0
案例:将二进制0110 1111转换成十六进制
二进制0110 1111转换成十六进制的结果是6f
计算器验证结果
8.3.2 负整数的进制转换
8.3.2.1 负整数的任意进制转十进制
案例:负整数二进制(补码)1010 0111转换为十进制
- 将补码1010 0111转换成原码
- 将二进制原码1101 1001 转换成十进制
符号位是1表示该整数是负数,因此最终的结果是-89
8.3.2.2 负整数的十进制转任意进制
案例:将十进制的负整数-89转换为二进制(补码)
最后将十进制的负整数-89转换为二进制(补码)转换结果是1010 0111
计算器验证转换结果
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!