本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-04-18
补码:正数的补码就是原码,负数的补码为对应正数(将符号位由1改为0)的二进制码取反加1 补码转原码:正数直接转换,负数减1取反再改变符号位。
数用补码表示,符号位参与运算。
公式:
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
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表示是“正溢”