深圳建网站兴田德润实惠,做同城特价的网站,介绍类网站建设策划书范文,网页图片保存前言
欢迎来到我的博客#xff0c;我是雨空集#xff08;全网同名#xff09;#xff0c;无论你是无意中发现我#xff0c;还是有意搜索而来#xff0c;我都感到荣幸。这里是一个分享知识、交流想法的平台#xff0c;我希望我的博客能给你带来帮助和启发。如果你喜欢我… 前言
欢迎来到我的博客我是雨空集全网同名无论你是无意中发现我还是有意搜索而来我都感到荣幸。这里是一个分享知识、交流想法的平台我希望我的博客能给你带来帮助和启发。如果你喜欢我的文章别忘了收藏、点赞、关注以便获取最新的内容。你还可以在文章下方留下你的想法和反馈我非常欢迎你的意见。我会继续努力提供优质的内容。期待与你一起分享知识、互相学习并建立一个积极的社区。让我们一起在这个知识之旅中取得进步 本博客文章已收录至我的Java SE专栏如需阅读其他有关博客笔记请转至该专栏下
传送门 --Java SE_程序员雨空集 原码
原码十进制数据的二进制表现形式最左边是符号位0为正1为负
利用原码对正数进行计算是不会有问题的。
十进制是逢十进一不会出现10这个数字。
二进制是逢二进一不会出现2这个数字。 原码的示例
比如十进制56转成二进制就是00111000。
00111000中最左边的0就是代表这个数为正数其余的0111000代表56也就是下面这个样子。 其中一个0或者一个1就代码1bit中文翻译叫比特位。
计算机里是通常是把8个bit分为一组叫做一个byte字节而字节是计算机中最小的存储单元。
而一个字节最大值表示为01111111转化成十进制就是127是正的127。
最左边的符号位取0其余位为数据因为是求最大每位上全部取最大为1。
而一个字节最小值表示为11111111转化成十进制就是-127是负的127。
最左边的符号位取1其余位为数据因为是求最小每位上全部取最小也为1 。 原码的弊端
又举个例子
现在有一个字节代表的数是-0也就是0如下图 如果我现在要对它进行1操作也就是下面这样 按理说01(1)但是根据上图这样做的话就粗问题了按照二进制的规则这样操作的二进制转成十进制为-1也就是下图才是我们想要的结果 如果在此实际值上再进行1操作又出现了下面的情况 为什么会出现这样的情况呢 想要理解清楚需要结合数轴去理解
如果我要用二进制表示0的基础上1但是因为符号位是1代表负数实际是在0的位置上往负的方向前进的1单位如下图所示 所以这就是原码的弊端在原码的基础上如果是负数计算结果就出错实际运算的结果跟我们预期的结果是相反的。 如果我们结合上面的数轴在进行负数计算的时候如果把数轴的方向倒转一下那不就得到了我们想要的结果了吗因此这就引出了反码的由来 反码
反码为了解决原码不能计算负数的问题而出现的
计算规则
正数的反码不变。负数的反码在原码的基础上符号位不变。数值取反0变11变0。
为什么正数的反码不变
因为正数之间的计算是没有任何问题只有我们上面举到的例子中有负数的计算才会有反码的出现 反码的示例
又又举个栗子
十进制-56的二进制原码是10111000。根据规则符号位不变。数值取反0变11变0。它的反码为11000111
验证反码能不能解决原码负数计算的问题我们可以验证一下
就看看-561的值是不是为-55的这个情况
-56的原码是10111000而-56的反码就是11000111。进行-561的操作就是在-56的反码11000111从最右边的数字进1位根据二进制逢二进一变为11001000而55的原码是0011011所以-55的原码就是1011011所以-55的反码就是1100100结果成立 这么一来你就懂了吧如果还没明白把上面的步骤多看几遍你就懂了 反码的弊端
又又又举个例子我现在
现在又一个十进制数字-2其原码是1000 0010其反码为1111 1101
如果对-2进行1操作之后其原码变为1000 0001反码变为1111 1110结果为-21-1,没问题如果对-2进行2操作也就是两次1操作原码会变成1000 0000 反码变为1111 1111结果为-220 也没问题如果对-2进行3进行操作也就是三次1错做原码会变成0000 0000反码变成0000 0000结果为-230到这里就不对起来了
为什么会出现这样的情况呢 就是因为二进制对于0的表达有两种方式如下图表格所示 十进制数 原码 反码 0 0000 0000 0000 0000 -0 1000 0000 1111 1111 -1 1000 0001 1111 1110 -2 1000 0010 1111 1101
怎么解决呢这就引出了补码的由来
当初的哪些计算机大佬是那么想的既然反码计算到0的时候会因为有2个0的表达方式而造成计算误差那我把反码中的两个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
这样就可以把0的两种表现形式给屏蔽掉了但是这里的补码是为了有负数、有反码的计算。
如果全部是正数的计算就用原码计算即可 补码
补码为了解决反码不能计算负数超过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
举例一个跨0的情况进行-45的操作
-4的补码是1111 11005是一个正数。正数的原码、反码、补码的值都是一样的所以补码为0000 0101把两者补码进行相加操作得到补码0000 0001表示十进制的数就是1成功 这么一来你就懂了吧如果还没明白把上面的步骤多看几遍你就懂了 补码的小细节
因为补码是在反码的基础上1得到的所以-127的补码就是1000 0001所以就会空出一位因为0和-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 ...... ...... ...... ...... -126 1111 1110 1000 0001 1000 0010 -127 1111 1111 1000 0000 1000 0001 -128 无 无 1000 0000
因为补码的这个特性-128是特殊规定的因此没有原码和反码。但是这也不影响因为计算机中数字的存储和运算都是以补码为基础进行的 总结
原码是用来表示十进制数据的一种二进制形式最左边的一位是符号位0表示正数1表示负数。但是原码不能直接用于负数计算如果用原码进行负数计算结果会出错实际运算的方向与正确运算的方向相反。 反码是为了解决原码不能计算负数的问题而出现的。对于正数反码和原码一样对于负数反码是在原码的基础上将符号位不变数值位全部取反即0变11变0。然而反码也存在一个问题那就是如果负数的计算结果跨过0那么结果会比实际结果多1。 补码则是为了解决反码不能计算负数超过0的问题而出现的。对于正数补码和原码、反码一样对于负数补码是在反码的基础上加1。这样负数就可以正确地用补码表示了。此外补码还可以多记录一个特殊的值-128这在用一个字节表示数据的情况下是特别重要的。