首页 > 编程知识 正文

求二进制补码,二进制补码转换十进制

时间:2023-05-05 04:01:37 阅读:144103 作者:3618

本人研究不深,如有错误请不吝赐教!!

首先,请作为最基本的介绍参考。

3359 blog.csdn.net/jdq 8576/article/details/82425265

百度百科: https://baike.baidu.com/item/补丁

源码反码补码二进制十进制小数部分的转化

1.正数的补码表示

正数补数=原码

负数的补数={原符号位不变} {数值位按位取相反的后1} or

={原代码的编码比特不变化} {数值比特从右边数第一个1及其右边的0不变化。 左边的位取反}以十进制整数97和-97为例:

97源代码=0110_0001b

97补数=0110_0001b

-97源代码=1110_0001b

-97补数=1001_1111b

2.纯小数的原码

我怎么得到纯小数的原码? 方法有很多,这里提供容易笔算的方法。

以0.64为例,可以看到其源代码为0.1010_0011_1101_0111b。

操作方法:

设0.64 * 2^n为x。 其中,n是保留的小数位数,即n是小数之后的小数。 x是乘法结果的整数部分。

这里,假设n为16

X=41943d=1010_0011_1101_0111b

也就是说,0.64的二进制表示左移16位后为1010_0011_1101_0111b,因此0.64d=0.1010_0011_1101_0111b被认为与查询结果一致

实验n取12,得到

X=2621d=1010_0011_1101b即0.64d=0.1010_0011_1101b,在忽略小数12位以后的位数的情况下计算结果也相同。

3.纯小数的补码

小数补码遵循以下规则:获得小数源代码后,小数点的前一位表示符号,找到并按原样写(从底部(右)位开始的第一个)1),然后参照1写0,参照0写1。

以-0.64为例,其原码为1.1010_0011_1101_0111b

补数为1.0101_1100_0010_1001b

当然在硬件语言如verilog中二进制表示时不可能带有小数点(事实上不知道哪里可以带小数点)。

4.一般带小数的补码

一般来说,在这种情况下首先转移到整数运算很方便。 小数补数一般是在计算机上正确进行浮点数处理的,如果无论如何都想求补数,只能求补数作为定点数。 也就是定点小数(在不支持浮点运算的硬件电路中)。

以-97.64为例,搜索到的源代码为1110_0001.1010_0011_1101_0111b

笔算过程:

- 97.64 *2^ 16=-6398935=1110 _ 0001 _ 1010 _ 0011 _ 1101 _ 0111 b,其中小数点从右边数第16个,与查询结果一致。

其补数为1001_1110_0101_1100_0010_1001b,这里采用负数补数={原码的编码比特不变化} {数值比特按比特反转1}的方法

5.补码得到原码

方法:码相不动、幅度值取反+1or码相不动、幅度值-1取反

-97.64补数=1001_1110 (.) 0101_1100_0010_1001b

相反=1110_0001 (.) 1010_0011_1101_0110b

1=1110_0001 (.) 1010_0011_1101_0111b与查询结果匹配

6.补码的拓展

运算时需要时,将二进制补数进行位数展开。 在这种情况下,必须向前展开符号位。

-5补数=4’b 1011=6’b11 _ 1011

ps .源代码的展开是将符号位置于开头,在展开位的上部0。

-5原码=4‘b’1101=6’b10 _ 0101,对其进行互补编码时为6’b11 _ 1011,与上述一致。

补数求真值知道一个数的补数,求真值。 如果是负数,则将该补数的数值部分按位反取后加1。 求出这个二进制数表示的十进制数后,加上负号就可以了。 如果是正数,则该二进制数表示的十进制数是真值。

例如,100真值: 00-----11 11 01=100,所以真值为-4

该示例是特殊的,该负数的补码与原始代码(真值)相同。

所以说

,补码到真值转换有两种转换方法,它的解释可以有有时钟来解释。

最后来谈谈小数/纯小数的补码问题。

求纯小数的原码、反码、补码

注意这里是纯小数,也就是-1到+1之间的小数,对于定点数表征的话,位宽全部用来存放小数位。。

了解规则后再细看。

【补码表示】为什么定点小数的-1补码表示为1.0000以及补码表示范围问题

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

原码

原码的表示方法:


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

反码

反码的表示方法


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

补码

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

机器数表示范围

https://blog.csdn.net/m0_37454852/article/details/78076027

以n位机器码为例。

原码:
  有符号整数:[-(2^n-1), 2^n-1];
  有符号小数:[-(1-2^(-n)), 1-2^(-n)];反码的表示范围和原码相同补码
  有符号整数:[-2^n, 2^n-1];
  有符号小数:[-1, 1-2^(-n)];

从上我们可以看出,有符号数的补码要比原码和反码多表示出一位来,那么究竟是为什么呢?

补码比原码、反码多出一位的原因:
  以8位机器码表示的有符号整数为例,它可以表示的原码和反码范围是[-127, 127],而可以表示的补码范围是[-128, 127]。
  原码和反码的±0是不同的表示方法,即:
    +0:00000000
    -0 :10000000
  而反码的±0都是同一个表示方法,同样以8位机器码为例:
    ±0 :00000000
  因此补码中便多出了一个<10000000>,可以用来表示其他的数,此处即可以表示真值为-128。在最位的1,既表示负号、又表示数值位。

https://blog.csdn.net/qq_39690706/article/details/85856792
根据上面的定义可以知道,原码和反码对于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:

https://ask.csdn.net/questions/211705

正负小数的补码怎样求
正负小数的补码怎样求?
和整数的规律一样吗,也是正小数不变负小数求反加一么
求举例

网友1:

那看定点数还是浮点数,
浮点数是用阶码,尾数等表示的,和补码没什么关系。
定点数只能表示纯小数,也就是0.xxx这样的数,它的补码是把小数部分xxx取补就好了(就是整数不变,负数取反加一),当然带上符号位。

网友2:
纯小数补码

若真值为纯小数,它的补码形式为,Xs.X1X2X3X4X5Xn,其中Xs表示符号位,补码的定义为:【X】补=X(0<=X<1)或2+X=2-/X/(-1<=X<0)(MOD=2)
纯小数在求它的原码、反码、和补码时方法和整数是一样的。
例如:X=-0.1011 系统要是规定为8位,那么它的原码为
[x]原=1.1011000 [x]反=1.0100111 [x]补=1.0101000
也就是说系统规定为8位,当位数不够的时候,要在最低有效数后面用0补齐,然后再求它的原码、反码、和补码。正小数也是按照这个方法。

论坛2:

https://bbs.csdn.net/topics/390379095

在定点小数中,为什么-1的补码为:1.0000?
网友1:
定点小数中没有-1,只有-1.0

网友2:

二进制小数 原码对应十进制值 补码对应十进制值0.00 0 00.01 0.25 0.250.10 0.5 0.50.11 0.75 0.751.00 1 -11.01 1.25 -0.751.10 1.5 -0.51.11 1.75 -0.25

网友3:
大神,你这里的二进制小数,最高位是符号位吗?如果是,
1.00(B) == -1(D)怎么算的?

最高位是符号位,0表示正数,1表示负数
求某个补码表示的负数对应的绝对值的步骤为:
各位取反,末位加1
1.00→各位取反→0.11→末位加1→1.00

想要了解更多,可以参见我另外一篇博客:
https://blog.csdn.net/edward_zcl/article/details/89439128
以及:
https://blog.csdn.net/AaricYang/article/details/87882868
https://blog.csdn.net/ferrarild/article/details/7050781

本文参考自:
https://blog.csdn.net/qq_39690706/article/details/85856792
https://blog.csdn.net/Anliya/article/details/5345741
https://blog.csdn.net/jdq8576/article/details/82425265
https://blog.csdn.net/qq_40816078/article/details/82689492
https://blog.csdn.net/moon9999/article/details/57130068

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