原码和反码的原理以及表示范围的缘由详情解析

原码和反码的原理以及表示范围的缘由详情解析


‘这片文章是为了说服我自己的,以自己教自己的视角写的,大家参考参考即可,不喜勿喷’

//,我们只看负数,因为只有负数的原补反不同,
//1)首先看下纯小数的原码,补码,反码,x是真值,假设字节长度为n,真值意思就是是它原本的值,比如
//-0.10000,换成十进制就是-0.5;n就是计算机的位数,说白了就是一串编码有多少位,其中第一位一般表示符号位
//原码:就是要表示出他的正负号,即如果为负数,那么小数点前面的二进制位要为1,反之则为0,那么如何计算?
//[x]原=1-x;什么意思?比如1的值为1.0000000,x的真值为-0.1000000,那么1-x是不是就是1.1000000;是不是就达到了转换的目的?
//表示范围:你看啊原码其实也是8位,其中第一位表示符合,而且当真值为正的时候,不会改变,只有为负的时候才会改变,那么我们只要看看当真值为负数时,
//原码纯小数的表示范围:当真值为负数是,原码为1.0000000~1.1111111,假设字节是n+1位,也就是-0~(2^(-n)-1),ps:加强一下理解,为什么原码明明有个1在前面不算?因为这个位是符号位
//在计算机中是不会把它与后面的数据为一起读的,只会根据这个负号位判断后面是正的还是负的,其实你也可以换一种想法,因为[x]原=1-x,
//那么x=1-[x]原,那么就这层面而言,原码值的表示范围是1~1+(1-2^(-n)),那么1-[x]原表示的就是0~[2^(-n)-1];所以是一样的,式子怎么来的,你就可以根据
//式子反着推,如果不想根据式子推,那就根据编码的意思去推,比如原码除了位置位,其他的和数据位一样,所以就可以根据数据位去推,但是推完要加个负号,因为它是个负数。
//当真值大于0时,原码的表示范围是0.0000000~0.1111111,也就是0~(1-2^(-n));又因为,它是原码,除了第一位代表符号位,不一样,
// 数据位都是一样的所以这么算原码的数据跟真值的数据就是一一对应的,就是-[2^(-n)-1]~[1-2^(-n)]
//所以原码的表示范围是-[1-2^(-n)]~[1-2^(-n)]

//补码:补码的意思也很明确,首先要让第一位表示符号位置,其次要让所有的数据位按值去反再加1,为什么补码是这样算的呢?因为进行了如下的式子转换
//[x]补=2+x;什么意思?首先x是纯负小数,假设x=-0.1001,2+x=10.0000000-0.1001000=1.0110000,是不是让真值x变成了[x]补,
//我们可以这么理解,首先2=1+1=1.0000000+1.0000000,所以2+x=1.0000000-0.1001000+1.0000000,那么第一个1就是让0.1001000转换成
//0.0110111+0.00000001=0.0111000的,也就是去反+1,然后后面一个1是用来1.0000000+0.0111000=1.0111000的,也就是让第一位变成1,即表示是负数的
//补码纯小数的表示范围:首先,同样,补码只用管负数,不用管正数,那么补码的表示范围是1.0000000~1.1111111,那么真值的范围是多少呢?如果将它分为符号位和数据位去计算它的真值表示范围,
//它跟原码就不太一样因为补码的数据位和真值的数据位不是一样的,是通过取反+1得来的,那么为什么是去反+1,前面说了,其实就是1-真值得出来的结果和取反+1是一样的,
//那么数据位去反+1其实就是1-x,所以同样的我们用1-补码的数据位,然后换成负数,就可以得到真值,那么补码的数据位表示范围是多少呢?补码的表示范围是1.0000000~1.1111111,
//那么数据位就是0~(1-2^(-n)),1-补码的数据位就是1~2^(-n),又因为是负数,所以真值表示的应该是-1~-[2^(-n)],而当x>0时,补码和原码一样,表示的范围是0~[1-2^(-n)]
//所以补码的表示范围就是-1~[1-2^(-n)],这个时候也许同学们就有疑问了,当x为负数的时候,明明补码只能表示-1~-[2^(-n)]啊,为什么多了个-[2^(-n)]~0呢?
//好你想想,补码1.1111111,表示的真值是不是-2^(-n)?是的,真值是怎么表示的?是不是-0.00000001那么0是怎么表示的?是不是0.0000000?,变化了几个位置?
//是不是只有最后一位变了?也就是说,数字-0.0000001到-0.0000000只变了一下,也就是真值,就不能在-2^(-n)和0之间,是离散型的!不是连续型的的,懂了吗?小老弟
//这也是为什么0的补码只有一种表示方法的原因,因为-0,补码表示不了,而+0,补码才能表示也就是00000000,其实也就是真值的表示

//反码:反码其实就只是比补码少加了一个2^(-n),而[x]补=2+x;所以[x]补=[x]反-2^(x-1),那么[x]反=2-2^(-n)+x;说白了意思就是,取反之后
//就不用再+1了;
//反码的表示范围很简单,其实就是补码取反但不在末位加了个1,对于小数来说就是不加这个2^(-n),对于整数来说就是不+1,我们就拿小数来举例子,
//前面说了,x取反+1,其实就是1-x,所以对于反码来说就是1-x+2^(-n),那么表示范围就用补码的表示范围加个2^(-n)就ok了,自己去算。
//因为反码的负小数比补码多加了一个2^(-n),所以反码就能表示-0了,所以0的反码表示不唯一

//移码比较容易理解,只要记住0的移码表示也是唯一的就行了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值