有符号二进制数--补码

link

1.计算机内,有符号数的3种表示方法:原码,反码,补码。

 

1)最高位为符号位,“0”为正,“1”为负,其余位为数值大小。

 

2)反码:正数    反码  = 原码;

                        负数    反码  = { 符号位不变}{ 数值位按位取反}

 

下面重点说一下补码!

 

2.整数的补码:

 

1)正数的补码 = 原码;

 

2)负数的补码 = { 原码符号位不变} { 数值位按位取反+1}

 

             or = { 原码符号位不变} { 数值位从右边数第一个1及其右边的0保持不变,左边按位取反}

 

3)举例:以十进制数+99-99为例:(符号位0为正数,1为负数)

 

           +99 原码 = 0110_0011 b

           +99 补码 = 0110_0011 b

 

            -99 原码 = 1110_0011 b

            -99 补码 = 1001_1101 b

 

注意:(a0的补码只有一个:

                      

                      +0 原码 = 0000_0000 b,-0 原码 = 1000_0000 b

                      +0 反码 = 0000_0000 b,-0 反码 = 1111_1111 b

                      +0 补码 = 0000_0000 b,-0 补码 = 0000_0000 b  -- 相同,均为0000_0000 b

         

               b8位二进制数的表示范围:

                            

                         8位原码:            -127 d -- +127 d

                     1111_1111 b --  0111_1111 b 

  

                         8位反码:            -127 d -- +127 d

                     1000_0000 b --  0111_1111 b

 

                         8位补码:            -128 d -- +127 d

                     1000_0000 b --  0111_1111 b

 

  

 

3.纯小数的原码:小数点前一位为符号位,若为正,则后面数值位不变;

                                                                                  若为负,则后面数值位取反加1

                                

     例子:0.9239 d 原码 = 0.1110_1100_1000_0100

                                   补码 = 0.1110_1100_1000_0100

 

                 -0.9239 d 原码 = 1.1110_1100_1000_0100

                                   补码 = 1.0001_0011_0111_1100

 

4.一般在硬件语言中使用二进制补码时,是不可能带有小数点的,而且一个数通常有正数和小数两部分,这种情况下最好的方法是先将该数转换为正数,再进行转换会。

 

例子:    -87.36    原码 = 1101_0111 . 0101_1100_0010_1000

 

求其补码,计算过程如下:

 

先用 -87.36 * 2^16 = -5725224 d = 1101_0111_0101_1100_0010_1000 b

此时再取反加1,则补码 =  1010_1000_1010_0011_1101_1000 b,

最后再除2^16,恢复小数点的位置即可。

 

 

 

 

posted @ 2022-08-19 22:44  luoganttcc  阅读(28)  评论(0编辑  收藏  举报