首页 > 编程知识 正文

定点小数补码表示的最小负数,定点小数—1的补码

时间:2023-05-03 11:08:39 阅读:214278 作者:1737

首先了解一下原码,反码,补码的概念

原码

原码的表示方法:


简单来说就是,在机器中我们使用0和1来区分一个数的符号,用0来表示正数,用1来表示负数。而原码表示就是将一个数绝对值的二进制表示出来后根据是正数还是负数在前面加0或1表示数的符号。这里注意一点,在定点小数中,原码是不能表示出-1这个值的

反码

反码的表示方法


简单易懂一些的话其实就是如果是正数,X的反码就等于原码,如果是负数,将X的数值位全部取反

补码



对求一个数的补码有一个简单的口诀,若X是正数,则X的补码等于原码,若X是负数,X的补码就是在求出原码的基础上数值位全部取反后在最后一位加1。

机器数表示范围

根据上面的定义可以知道,原码和反码对于0有两种表示方法
原码中
[+0] = 0.0000,[-0] = 1.0000
反码中
[+0] = 0.0000,[-0] = 1.1111
补码中
[+0]=[-0]=0.0000
这里可以知道,在表示数据的时候,补码比原码少了一个-0,而由于表示数据所用的位数是一样的,也就是能表示的整数的个数不会变,所以补码会比原码和补码多表示一个数

对于定点整数

设位数一共为8位
原码表示范围为 -127-127,即1111 1111~0111 1111
反码表示范围为 -127-127,即1000 0000~0111 1111
补码表示范围为 -128-127,即1000 0000~0111 1111
我们可以尝试求一下-128的原码,但可以发现7位二进制表示不出来,必须得用8位二进制表示,但这样符号位就被占用了。但由于上面说的补码比原码和补码少一个0的表示方法,这就让补码多了一个10000000来表示其他的数,这里具体的细节我也不是很懂@_@,但可以这样记吧,-1到-127已经有对应的原码和补码了,所以也会有对应的补码,而10000000首位是1代表负数,不能和其他数的表示起冲突所以就是-128了。由此,补码可以表示128个负数,1个0以及127个负数共256个数

对于定点小数

还是设位数一共8位
原码表示范围为1.111 1111 ~0.111 1111,即-127/128到127/128
反码表示范围为1.000 0000~0.111 1111,即-127/128到127/128
补码表示范围为1.000 0000~0.111 1111,即-1到127/128
在这里原码和反码都好理解,就是补码会有一个问题,为什么补码会有一个1.000 0000而且居然对应的值是-1,也就是说如果小数用补码表示的话最小值是-1。这里如果用一开始说的取反加一你会发现根本不是这个值。之后才知道取反加一靠的是原码,但看前面原码的定义公式你会发现原码根本表示不了定点小数-1,原码所能表示的是定点整数-1,定点小数-1这里严谨一点的话其实是-1.0。
这里要求定点小数-1.0的补码的话就要用到上面的补码定义公式了(要不然我怎么会贴hhh),由公式可知,-1.0的补码为2+X = 2-1.0 = 1.000 0000
当然也有这样的理解

总结:由于补码表示0的唯一性,补码比原码少一个-0的表示,多一个-1的表示以及负整数表示范围多了一个-128
PS:主要是把自己最近碰到的问题写一下让自己记牢一些。其实如果把上面贴的几个公式吃透的话这些问题根本不会有的orz,注意对比原码反码补码边界的取值你会发现其实说的就是这些东西orz

参考:

http://bbs.kaoyan.com/t2806127p1

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。