首页天道酬勤二进制小数补码(负数二进制的补码公式)

二进制小数补码(负数二进制的补码公式)

admin 12-04 05:03 282次浏览

作者:Sotyoyo

来源:https://segmentfault.com/a/1190000038573204

如何描述

学习目标

电脑中的一个‘数字’?(本文有答案)补语到底是什么?你为什么发明它?为什么减法可以用补数计算?获取原码补码的原理是什么?你怎么知道一个有n位的数,它能代表什么范围的整数?什么是浮点数?如何用二进制表示浮点数?浮点数的精度是多少?(下一讲)

对比一个时钟,来看二进制补码

数据应该怎么在计算机内存储?

在计算机世界中,无论任何数据形式,都只能用二进制来表示和计算,因为电信号只有两种状态作为开关。二进制,简单来说,我觉得是一个计数规则。与我们从小学到大学的十进制相比,二进制就是每一个二进制。例如,5 (10)=101 (2),5在十进制数中被计为一位,因为它只有一个“位”,而101 (2)在二进制数中被计为三位,每一位都作为电信号存储在计算机的半导体中。我们这里的‘比特’叫做1比特,这个比特非常重要,它直接影响到数字的表示范围。用于存储信息的半导体的数量是有限的,因此用于表示该数量的位数也是有限的。我们不能随意无限扩张。我们应该尽可能地增加表示范围,控制数据的存储空间。比如在Java中,一个int类型占用4 Bytes,我偷偷告诉你一个Bytes等于8 bits,那么在Java中,int占用32 bits:你心目中是什么样子的:0000,000,000,000,000,000,000,000,000,000,000?看起来不空虚吗?那就看看下面这张图吧!这就是题目中问题1的答案——数据以电容信号的形式存储在计算机硬件的一些半导体中,你只能想象它是什么样子(比如上面的32个零)。我不想在这里描述基本系统是如何转换的。这不是我们今天讨论的重点。如果你感兴趣,你可以自己搜索。00-1010整数分为正整数、负整数和零。如果你想简单地表示一个无符号整数,定义一个4位的正整数,那么6 (10)=0.23 12 12 10 20=0.110 (2)在这种情况下,我们不能表示负数,那么这样可以表示多少个非负整数呢?即0000 (2) \~ 1111 (2),即[0 \ ~ 23 22 120]=[0 \ ~ 15],即2 4。但我只想说——6。我该怎么办?我们只能牺牲一个人.不,这是牺牲一点。也就是说,我们要取出一位作为符号位,其中0表示正,1表示负。那么,同样的6: 6 (10)=1221210 * 20=0110 (2)我们一定要注意这次和上次的计算方法的区别,输一个2 ^ 3的计算!因为这次存储的值只有三位,一位作为符号位:符号位值位0.110。自然,我们会想到用1110 (2)来表示-6的二进制(我必须先声明这是:no _ good3360的错误,请继续阅读)。这里有一个问题。如果要你算1-6=/* *电脑不会做减法,只能用1 (-6)实现1-6 * */0001110111。你会发现结果是-7,这显然是错误的。(原因是第一位数字是用来表示正号或负号的,所以不能用于计算)

为了解决这个问题,人们提出了补语的概念。当负数用二进制补码表示时,符号位可以和有效值部分一起参与运算,减法运算可以转换成结果正确的加法运算。原理呢?别担心,看看下面这个家伙。这是一个时钟,二进制。我们用自己的生活经验来回答以下问题:Q1。现在是八点钟。五小时后是什么时候?8=13但是时钟上没有13点钟,所以你看到的是1点钟的Q2。现在是八点钟。五小时前是什么时候?8-5=3 3点!但是如何通过添加来解决这个问题呢?在这里,我们可以用8 7得到3点。8-5可以看作时针从8点向前移动5小时回到3的位置,但也相当于时针从8点向后移动7小时到达3的位置。那你心里肯定有些疑问。小学数学告诉我们8-5=3,但是你可以给我解释一下为什么8-7等于3!$ \ begin { cases } \ text {-50=-5 } \ \ text { 0=12 } \ \ text {当只有一个时钟时(当只有一位时),0=12(看时钟,0点也是12点,对吗?)} \end{cases}$ So -5 12=7=-5,我们可以看到这里的-5等于7,我们把十进制中的7和-5称为一组补数。这样我们就可以用加代替减,让计算机把符号位带进来,不懂的话还是可以正常操作的。

,那你听听我的另一种解释:8+7=15,但是时钟是一个12进制的工具,所以十进制的15 (10) 的实际表达是12进制的13 (12) ,但是由于我们只有一个时钟,就相当于我们只有一个比特位来存储13 (12) 这个数据,那么第二位"1"就 溢出 了,这个"1"相当于是被一个黑洞给吞掉了,我们根本没有办法去找回来,所以最后只剩下一个12进制的3 (12) ,所以最后8+7=3!那么,在二进制中,该怎么计算出 补码 呢?正数和0的补码就是该二进制本身,也就是 原码 。负数的补码则是将其对应正数的原码按位取反得到 反码 再加1。原理呢!我们假定现在用2个比特位来表示1个数,依葫芦画瓢,列出下面的不等式组:$\begin{cases} \text{原码 + 补码 = 00}\\ \text{00 = 100} \ \ \text{只有2个比特位时} \end{cases}$补码 = 100 (2) - 原码 = (11 (2) + 01 (2) )- 原码 = 11 (2) - 原码 + 01 (2)而11 (2) - 原码是什么?仔细想一下,这不就是相当于是原码取反后的结果吗!写到这里,我想你终于可以弄懂 问题2 了吧?

小数的二进制表示

小数可以拆成整数部分和小数部分,整数部分的表示方法在上面,小数部分应该怎么做呢?举例,十进制123.45表示成二进制如下图:具体的转换方式是:整数部分采用十进制转二进制方法进行小数部分乘以2,然后取整数部分。不断重复该操作直到 小数部分为0,或达到指定的精度你想要的只是岁月静好。但是呢,不是所有的小数都能转换有限位数的二进制小数。例如10进制0.2的二进制:0.2 x 2 = 0.4 00.4 x 2 = 0.8 00.8 x 2 = 1.6 10.6 x 2 = 1.2 10.2 x 2 = 0.4 00.4 x 2 = 0.8 00.8 x 2 = 1.6 10.6 x 2 = 1.2 1……不光岁月静好,我还送你天荒地老这是为什么呢?抛开数学概念,十进制中1的一半是0.5,二进制中1的一半是0.1;十进制中自然可以十等分形成小数,所有不能十等分的都是无限循环,同理二进制中只能二等分,所有不能二等分的自然都是无限循环。正如切蛋糕,二进制就像一把一次只能切一半的刀。讲了这么久,该表示表示了吧?所以, 理论 上,我们可以这样存储小数(以123.5为例):符号位 整数位 小数位 0 0111,1011 1000,0000但是,这种方法是不被采用的,实质上,被用来表示小数的东西叫做 浮点数 。

浮点数的二进制表示

敬请期待

本文引用了

为什么十进制小数转换成二进制有可能无限循环? 粗犷的皮卡丘 的回答浮点数在计算机中是如何存储的?

V (base) : 下标base代表进制数,V则代表了在该进制下的值表示。

作者:Sotyoyo

来源:https://segmentfault.com/a/1190000038573204

容器云是什么怎么查看git分支从哪个源分支拉的C#实现Table的Merge服务节点收到大量内网IP的访问是否正常? 负载均衡 ULB
cpu晶体管为什么会计算(cpu为什么需要那么多晶体管) 二进制运算在线(二进制怎么计算方法)
相关内容