首页 > 其他分享 >原码、反码、补码

原码、反码、补码

时间:2022-12-20 17:06:11浏览次数:62  
标签:0000 补码 000 111 反码 原码

原码、反码、补码 在线计算:​​http://www.atoolbox.net/Tool.php?Id=952​

1、计算机中都是用 "补码" 表示

在计算机系统中,数值一律用 补码 来表示(存储)。

主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

  • 正数原码、反码、补码 " 相同
  • 负数用补码表示。如果 负数也用原码表示,对于 8位二进制来说,表示范围就只有255个数,  -128无法表示。

8位 二进制 的 表示法的数据范围:

原码: -127 ~ 127                  1 111 1111   到  0 111 1111
反码: -127 ~ 127
补码: -128 ~ 127

2、原    码

最高位:是0表示正数,是1表示负数。

将 最高位 做为 符号位( 0代表正,1代表负,其余各位代表数值本身的绝对值

+7 的 原码:0  000  0111
 -7 的 原码:1  000  0111

3、反    码

一个数如果值为正,那么反码和原码相同
一个数如果为负,那么符号位为1,其他各位与原码 " 数值位 "  相反。

+7 的 反码:0  000 0111
 -7 的 反码:1  111 1000    

解释:要得到 -7 的反码,首先的看 +7 的数值位,+7 的数值位是 000 0111,数值位取反得到 111 1000,然后在添加上 符号位,即可得到 -7 的反码为 1 111 1000

3.1 +0 和 -0 

按照反码规则,这时就出现了 +0 和 -0 :

+0 和 -0 的 原码 :

  • +0 原码:0  000  0000
  • -0 原码:1  000  0000

+0 和 -0 的 反码

  • +0 反码:0  000  0000
  • -0 反码:1  111  1111

原码、反码、补码_与运算

4、补    码

原码、反码 " 都不利于计算机的运算。
比如:原码表示的 7 和 -7 相加,还需要判断符号位。同时只有一个 0,但是0的反码却分为 +0 和 -0

补码 的 补码 就是 原码,有点负负得正的意思。

补码运算:

  • 正数:" 原码,反码、补码 " 都相同
  • 负数的补码 是 负数原码的数值位取反,然后带上符号位加 1。( 负数的补码:符号位不动,其他位求反,最后整个数 + 1,得到原码

    -7 的补码:=
            1 000  0111    (原码)
            1 111  1000    (反码)       符号位不变,原码的数值位 000  0111 取反 得到 111  1000
            1 111  1001    (补码)

解决 +0 和 -0 问题

求负数的补码时,取反后,加1时 需要符号位参与运算

+0 的 补码 为 00000000
-0 的 补码 也是 00000000

原码

反码

补码

0

+0

 0 000 0000

 0 000 0000

 0 000 0000

-0

 1 000 0000

 1 111 1111

 1 111 1111 + 1 0 000 0000  ( "最高位的进位" 被舍弃 )说明:符号位不变,其他位取反得到 1111 1111,然后加 1(符号位参与运算,即整个数加1) 得到补码 0000 0000 ,所以 +0 和 -0 补码一样 

1

1

0 000 0001

0 000 0001

0 000 0001

-1

-1

1 000 0001

1 111 1110

1 111 1110 + 1  得到补码  1 111 1111

127

127

0 111 1111

0 111 1111

0 111 1111

-127

-127

1 111 1111

1 000 0000

1 000 0000 + 1  得到补码  1 000 0001 

当 +0 和 -0 补码统一都为 0000 0000 后,还有一个 1000 0000 没有对应数字,于是规定 -128 的补码是 1000 0000,可以理解为是一个特殊性。

原码、反码、补码_补码_02

可以看到 -128 没有 原码、反码,所以是直接规定的 -128 的补码是 1000 0000

这样规定后,负数的补码在机器中就好算了。在约定的范围内( -128 --- +127,对16位32位64位等扩大范围)
先将该负数取绝对值,再用二进制表示出这个绝对值 (不管符号位),对该二进制数进行取反加一操作就得到负数的补码了
-128 绝对值是 128
128的二进制表示为:
1000 0000
取反
0111 1111
加1
1000 0000
这就是-128的补码
这种办法算出的结果符合 “规定值”,规定而已。

4.2 补码运算(加减)

求一个负数的补码时,取反后,加1时需要符号位参与运算

补码运算(加减)也需要符号位参与运算

补码运算要注意的问题:

  • 1. 补码运算时,其符号位与数值部分一起参加运算。
  • 2. 补码的符号位相加后,如果有进位出现,要把这个进位舍去(自然丢失)。
  • 3. 用补码运算,其运算结果亦为补码。在转换为真值时。
            若符号位为0,数位不变;
            若符号位为1,应将结果求补才是其真值。

-7 的补码:=
            1 000  0111    (原码)
            1 111  1000    (反码)
            1 111  1001    (补码)

两个补码运算(加减)符号位参与运算。
        +7 补码  0000  0111
        -7 补码  1111  1001

        +7 的补码 加 -7 的补码

                0000   0111
       +       1111   1001
------------------------------
           1   0000   0000      ( 符号位进位舍弃 )

因为计算机中运算器的位长是固定的,上述运算中产生的最高位进位将丢掉

溢出及补码溢出的判断
无论采用何种机器数,只要运算的结果大于数值设备所能表示数的范围,就会产生溢出。  溢出现象应当作一种故障来处理,因为它使结果数发生错误。异号两数相加时,实际是两数的绝对值相减,不可能产生溢出,但有可能出现正常进位;同号两数相加时,实际上是两数的绝对值相加,既可能产生溢出,也可能出现正常进位。
由于补码运算存在符号位进位自然丢失而运算结果正确的问题,因此,应区分补码的溢出与正常进位。

 

补码运算

  用补码进行运算,减法可以通过加法实现

  7-6=1    (7 的补码 和 -6 的补码 相加)

  7 的补码 :0000  0111

 -6 的补码: 1111  1010

               = 1 0000 0001      

  最后的进位溢出(总共 8 位,这得到 9位,所以第 9 位舍弃),所以舍弃,得到  0000 0001 ,表示 1

  -7+6 = -1

  -7的补码和6的补码相加:11111001 + 00000110 = 11111111

  11111111 是 -1 的补码

示例:某数字设备用五位二进制表示数,计算  
     (1)9+3  (2)-9-3  (3)9+12  (4)-9-12
  解:(1)[+9]补+[+3]补= 01001+ 00011 = 01100 = +12 正确;
         (2)[-9]补+[-3]补= 10111+ 11101 = 110100 = 10100(符号位进位自然丢失),            其真值为-1100 = -12正确;
         (3)[+9]补+[12]补= 01001 + 01100 = 10101 其真值为-1011 =-11错误,产生了溢出;
         (4)[-9]补+[-12]补 = 10111+10100 = 101011 其真值为01011= +11 错误,产生了溢出。
(1)、(2)两题结果均正确,查其最高位和次高位的进位位,不是均无进位产生,就是均产生进位;(3)、(4)两题结果均错误,查其最高位和次高位的进位位,只有一位产生了进位。此即为判断机器是正常进位还是溢出的基本依据,在微型机中可用异或电路来实现上述的判断。

5、移    码

正数

正数(定点小数、定点整数):
          原码,补码,反码相同;
          移码只要在原码的最高位+1就可以了
    

负数

负数(定点小数、定点整数)负数补码求法:也就是 “绝对值的原码取反加1”
        反码:保持原码符号位不变,数值位取反
        补码:反码的最低位+1 (即 取反加1,符号位也运算)
        移码:与补码的符号相反,数值位保持不变
     -1 原码:1000 0001
     -1 反码:1111 1110  (符号位不变,数值位取反)
     -1 补码:1111 1111  (-1的反码加1:1111 1110 +1 = 1111 1111)

 

标签:0000,补码,000,111,反码,原码
From: https://blog.51cto.com/csnd/5956113

相关文章

  • 原码 反码 补码
    只要是整数,内存中存储的都是二进制补码正整数的原码反码补码相同  000000000000000000000001(32位1)负整数:100000000000000000000001(32位-1)原码----->直接按正......
  • 计算机的原码,反码,补码
    我一直想为什么计算机中一定要规定有反码、补码?原码不能解决计算机的计算能力吗?反码,补码的出现解决哪些问题?带着这个问题,我对计算机知识进行脑补。原理因为计算机的一切都是......
  • 原码反码和补码的区别及用法笔记
    之前学习原码、反码、补码的时候就学的很懵,知道反码和补码怎么算的,但是不知道有什么用。今天看了几个视频,虽然有举例,但是自己换了个数就算不出来了。后来终于弄明白了。......
  • 补码4×4阵列乘法器设计
    视频讲解:https://www.bilibili.com/video/BV1ye4y1H7Ao/一、简述乘法运算在全部算数运算中大约占据三分之一,因此采用高速乘法部件,无论从速度上还是效率上,都十分必要。本......
  • PC_机器数_定点负数的原码_补码_反码在结构上的关系
    文章目录​​预备知识​​​​模2范畴内的取反​​​​证明二进制补码规律​​​​模k同余​​​​......
  • 原码、补码、反码的表示及计算
    今天简单总结了一下计算机的原码、补码、反码的表示,谨以此文缅怀教过我数字逻辑电路课程以及计算机组成原理课程的老师。一个数在计算机中的二进制表示形式我们称之为机器......
  • C - 原码、反码和补码
    原码计算机使用二进制编码存储数字.用第一个bit位表示符号,1表示负号,0表示正号.4个bit能够表示的数字:最小:1111→-7最大:0111→7但是原码不能进行加减......
  • golang获取补码,原码
    packagemainimport("encoding/binary""fmt""strconv")funcmain(){vara=[]byte{0x15,0x4B}varb=[]byte{0xE0,0x15}//fmt.Println(fmt.......
  • 源码补码与反码
    title:源码补码与反码comments:truedate:2022-11-2113:24:55tags:javacategory:计算机底层存储数据时使用的是二进制数字,但是计算机在存储一个数字时并不是直......
  • 原码,反码,补码
    源码源码就是该数的二进制数反码整数的反码是其本身,负整数的反码是0变1,1变0;补码整数的补码就是本身,负整数的补码是反码+1;......