运算方法及运算器

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-04-18

定点补码加、减法运算

补码:正数的补码就是原码,负数的补码为对应正数(将符号位由1改为0)的二进制码取反加1 补码转原码:正数直接转换,负数减1取反再改变符号位。

补码加减法

数用补码表示,符号位参与运算。

公式:

  • + [y] = [x+y]

1、已知x = +1000000,y = +0001000,则有 [x+y]为?

2、已知x = +0000111,y = -0010011,则有 [x+y]为?

  01000000     ---> x的补码
+ 00001000     ---> y的补码
–––––––––––––
  01001000     ---> (x+y)的补码

<!-- 对应 -->

       +64    
        +8 
–––––––––––––
       +72

  00000111     ---> x的补码
+ 11101101     ---> y的补码(10010011 -> 00010011 -> 11101100 -> 11101101) 负数补码:对应正数的二进制码取反加1
–––––––––––––
  11110100     ---> (x+y)的补码

<!-- 对应 -->

        +7    
       -19     ---> 负数补码转原码: 11101101 -> 11101100 -> 00010011 -> 10010011 -> -19
–––––––––––––
       -12     ---> 负数补码转原码: 11110100 -> 11110011 -> 00001100 -> 10001100 -> -12
  • - [y] = [x-y] = + [-y]

3、已知 x = -0111000, y = -0010001,则有[x-y]为?

  11001000     ---> x的补码(10111000 -> 00111000 -> 11000111 -> 11001000)
+ 00010001     ---> -y的补码(-y为正数,即补码为原码,00010001)
–––––––––––––
  11011001     ---> (x-y)的补码

<!-- 对应 -->

       -56     ---> 负数补码转原码:11001000 -> 11000111 -> 00111000 -> 10111000 -> -56
+       17     
–––––––––––––
       -39     ---> 负数补码转原码:11011001 -> 11011000 -> 00100111 -> 10100111 -> -39

溢出判断方法

由于计算机的字长是固定的,因此计算机中 数的表示范围是有限的,若两个有符号数进行加、减运算的结果超出给定的取值范围,就称为溢出。

已知 x = +1000000, y = +1000001 ,求两数的补码之和。

  01000000   64
+ 01000001   65
–––––––––––––
  10000001 => (-127的补码) : 负数的补码 => 对应负数就是 减1取反再加负号 => 10000000 => 01111111 => 127 => -127

两个正数相加答案却是负的,显然结果是错的,原因是两数之和为129,大于8位补码的最大正数127,产生了“正溢”,导致符号为遭到了破坏。

已知 x = -1111111, y = -0000010 ,求两数的补码之和。

  10000001   -127
+ 11111110   -2
–––––––––––––
 101111111 => 第一位的1由于超出自然丢失 => 01111111 => 127

两个负数相加,得到正数,答案应该为 -129,超出了8位补码所了表示的最小负数-128,产生了“负溢”。

常用的检测之法有两种,进位检测方法和变形补码检测方法。

1、进位检测方法

用符号位的进位与最高数字位的进位进行异或来检测,若异或的结果是1,则溢出,为0则没有溢出

x = +1011001 , y = +1000110, 求两数的补码之和。

  01011001   进位为0
+ 01000110   进位为0
–––––––––––––
  10011111

符号位两个都为0,所以进位0,最高数值为两个都为1,所以进位是1,异或结果为1,所以溢出。

2、变形补码检测方法

一个符号位只能表示正负两种情况,当产生溢出时,符号位被破坏,如果将符号位扩充为两位,其所能表示的信息量就随之扩大,既能检查是否溢出,又能指出结果的符号,这种编码称为变形补码。

变形补码检测方法是,每个操作数在运算时都采用两个符号位,正数用00表示,负数用11表示,两个符号位和数值位一起参与运算,若运算结果的两个符号位的代码一致表示没有溢出,反之则表示溢出,这时第一符号代表了该数的真正的符号,第二符号位被破坏。

x = +1011001 , y = +1000110, 求两数的补码之和。 并判断是否溢出

  001011001  
+ 001000110   
–––––––––––––
  010011111 => 前两位符号位不一致表示溢出,第一位为0表示是“正溢”