鸿蒙都发布了,不要再浑浑噩噩,赶紧来学习计算机底层编码原理(上)

简介: 哈喽,大家好,我是指北君。曾几何时,指北君北原码反码补码绕的有点晕,网上教程也很多,详细的太难理解,容易理解的又有问题。于是乎指北君花了很长时间,肝出了这篇文章,目的是让一个小白看完都能彻底理解。我们知道日常生活中使用的数分为整数和实数,整数的小数点固定在数的最右边,可以省略不写,而实数的小数点则不固定。在计算机中只能识别和表示“0”和“1”,而无法识别小数点,因此要想使得计算机能够处理日常使用的数据,小数点的问题是不可避免的。关于计算机系统中实数的表示,在下篇文章中会讲解。本篇博客我们讲解的是整数在计算机系统中如何表示。

在各种大学教材,各种网站论坛中,对于整数编码表示方法的正确打开姿势(姿势要帅)如下:

40.jpg


1、机器数


机器数(computer number)是数字在计算机中的二进制表示形式。机器数有2个特点:

①、符号数字化。因为计算机硬件只认识两种物理状态(用0和1表示),因此数据的正负号在机器里就用一位二进制0或者1来区分。在计算机用一个数的最高位存放符号, 0代表符号“+”,以1代表符号“-”。

②、机器数的大小受机器字长的限制。机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长8位叫一个字节(Byte),机器字长一般都是字节的整数倍,如字长8位、16位、32位、64位。

比如在字长为8的计算机中,十进制数+5,其机器数为00000101;十进制数-5,其机器数为10000101。


2、真值


计算机机器数真正的值称为真值。因为机器数的最高位是符号位,所以我们在计算真值的时候要分区分开。

比如上面讲的机器数10000101,单纯作为一个二进制数,我们转换为十进制是133。但是其真值是不计算符号位的,其最高位的1表示"-"。所以10000101的真值为-5。


3、机器数的原码、反码、补码三种形式


前面我们讲过机器数是在计算机中的二进制表示形式,但是在计算机中,这种表现形式又分为原码、反码、补码等三种最常用的形式。

ps:下面举例都是字长为8。


①、原码

41.png

比如:

[+5]原码=0 0000101

[-5]原码=1 0000101

原码表示与真值对应直观,而且转换也简单。但是用原码进行加减运算的时候,会出现以下问题:

42.png

注意:计算机是没有减法器,只有加法器,减法运算可以转换为加上那个数的负数。

我们发现通过原码计算1 - 1 表达式结果居然是 -2。所以早期计算机机器数采用原码编码的时候,在进行原码加减运算时,必须先判定是否是两个异号数相加或两个同号数相减,若是,则必须判定两个数的绝对值大小,根据判断结果决定运算结果符号,并用绝对值大的数减去绝对值小的数。也就是说用这样一种形式进行加运算时,负数的符号位不能与其数值部分一道参加运算,而必须利用单独的线路确定符号位。很显然,这样设计电路就很复杂,这是不经济实用的,为了解决这个问题,反码产生了。


②、反码

43.png

我们用反码来计算 1 - 1

44.png看上去结果好像是正确的了,但是大家发现没,结果是-0,虽然对于0的符号没有什么实际意义。但是在计算机中,0如果用原码和反码表示会有两种形式:


45.png


两种编码就两种编码吧,只不过是多占用一个计算机表示数的编码形式。只要结果是正确的,我们还是能够忍受的,然而。。。。

请用反码计算表达式  2 -1


46.png


是不是很奇怪,原码计算 2 - 1 得到的结果居然是 0 。其实稍微分析计算过程我们也知道,再用反码进行加法运算的时候发生了进位,而由于字长为8,进位就直接省略了,便造成了错误。这肯定是不被允许的,所以采用反码的计算机解决办法如下:

反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)。


47.png48.png

采用反码运算虽然较好的解决了原码运算所遇到的困难或问题,但由于循环进位需要二次算术相加,延长了计算时间,这同样给电路带来麻烦。这时候补码登场了。


③、补码

49.png


我们来看下面这个例子:

2 - 1 = 150.png

9 + 12 = 21

51.png

相关文章
|
8月前
|
存储 JavaScript 前端开发
“纯血鸿蒙”要来了,赶紧入手学习吧
1月18日,华为宣布HarmonyOSNEXT鸿蒙星河版面向开发者开放申请,这一最新版本的鸿蒙系统也被喻为“纯血鸿蒙”。赶紧入手学习吧
457 1
|
18天前
|
缓存 API 数据安全/隐私保护
自学记录:学习HarmonyOS Location Kit构建智能定位服务
作为一名对新技术充满好奇心的开发者,我选择了HarmonyOS Next 5.0.1(API 13)作为挑战对象,深入研究其强大的定位服务API——Location Kit。从权限管理、获取当前位置、逆地理编码到地理围栏,最终成功开发了一款智能定位应用。本文将结合代码和开发过程,详细讲解如何实现这些功能,并分享遇到的挫折与兴奋时刻。希望通过我的经验,能帮助其他开发者快速上手HarmonyOS开发,共同探索更多可能性。
104 5
|
23天前
|
API 数据安全/隐私保护 UED
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
在掌握了鸿蒙系统的开发基础后,我挑战了蓝牙功能的开发。通过Bluetooth A2DP和Access API,实现了蓝牙音频流传输、设备连接和权限管理。具体步骤包括:理解API作用、配置环境与权限、扫描并连接设备、实现音频流控制及动态切换设备。最终,我构建了一个简单的蓝牙音频播放器,具备设备扫描、连接、音频播放与停止、切换输出设备等功能。这次开发让我对蓝牙技术有了更深的理解,也为未来的复杂项目打下了坚实的基础。
108 58
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
|
24天前
|
安全
【HarmonyOS学习】应用文件访问
访问和管理应用文件,对于每个应用,系统会在内部存储空间映射出一个专属的应用沙箱目录,是应用文件目录与一部分系统文件所在的目录组成的集合。也就是应用可见的目录范围即为“应用沙箱目录”。 优点: * 隔离性:应用沙箱提供了一个完全隔离的环境,使用户可以安全地访问应用文件。 * 安全性:应用沙箱限制了应用可见地数据地最小范围,保护了应用文件地安全。
61 5
【HarmonyOS学习】应用文件访问
|
24天前
|
API
鸿蒙开发学习:动画
鸿蒙原生动画API使用
69 4
鸿蒙开发学习:动画
|
18天前
|
人工智能 数据可视化 API
自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
本文介绍了使用HarmonyOS的Calendar Kit开发日程管理应用的过程。通过API 13版本,不仅实现了创建、查询、更新和删除日程等基础功能,还深入探索了权限请求、日历配置、事件添加及查询筛选等功能。实战项目中,开发了一个智能日程管理工具,具备可视化管理、模糊查询和智能提醒等特性。最终,作者总结了模块化开发的优势,并展望了未来加入语音助手和AI推荐功能的计划。
132 1
|
2月前
|
开发者 容器
Flutter&鸿蒙next 布局架构原理详解
本文详细介绍了 Flutter 中的主要布局方式,包括 Row、Column、Stack、Container、ListView 和 GridView 等布局组件的架构原理及使用场景。通过了解这些布局 Widget 的基本概念、关键属性和布局原理,开发者可以更高效地构建复杂的用户界面。此外,文章还提供了布局优化技巧,帮助提升应用性能。
123 4
|
2月前
|
存储 Dart 前端开发
flutter鸿蒙版本mvvm架构思想原理
在Flutter中实现MVVM架构,旨在将UI与业务逻辑分离,提升代码可维护性和可读性。本文介绍了MVVM的整体架构,包括Model、View和ViewModel的职责,以及各文件的详细实现。通过`main.dart`、`CounterViewModel.dart`、`MyHomePage.dart`和`Model.dart`的具体代码,展示了如何使用Provider进行状态管理,实现数据绑定和响应式设计。MVVM架构的分离关注点、数据绑定和可维护性特点,使得开发更加高效和整洁。
181 3
|
3月前
|
容器
Flutter&鸿蒙next 布局架构原理详解
Flutter&鸿蒙next 布局架构原理详解
|
3月前
|
前端开发 JavaScript 小程序
前端新机遇!为什么我建议学习鸿蒙?
【10月更文挑战第4天】前端新机遇!为什么我建议学习鸿蒙?
153 0
前端新机遇!为什么我建议学习鸿蒙?

热门文章

最新文章