负数二进制补码的推导
今天在看MIT公开课【编程范式】的时候发现二进制码补码只是不是很清楚,于是推一下
负数 原码 推 补码
注:t(原码),a(反码),c(补码)
拿15举例 15: 00000000 00001111 (t)
要推出-15 ,因为 15 + (-15)= 0
15:00000000 00001111 ,0 :00000000 00000000
所以-15:
00000000 00001111
+
? (-15)
=
00000000 00000000
因为:
11111111 11111111 + 1 = 00000000 00000000
所以我们先算出和为11111111 11111111的数,然后+1即可,也就是下面的a
00000000 00001111
+
a
=
11111111 11111111
即:
00000000 00001111 各位取反:11111111 11110000(a,其实就是反码)
于是:
00000000 00001111
+
11111111 11110000(a)
=
11111111 11111111
而a + 1 ,即 11111111 11110001 ,也就是与15相加得0的值
于是就可得出:
00000000 00001111
+
11111111 11110001 (c)
=
00000000 00000000
而c 就是负数的补码
(取反)
负数原码求补码 t --------> a ------> a+1 = c
(取反)
负数补码求原码同理 c -------> c反 ------> c反+1 = t
对于有符号的整数:
原码t 反码a 补码c
正数 47 00101111 00101111 00101111
负数 -47 10101111 11010000 11010001
看两个例子:
- 38 + 25 = -13
原码:
-38: 10100110
+
25:00011001
补码:
-38:11011010
+
25: 00011001
=
-13: 11110011(补码)->10001101(原码)
38 - 25 = 13
原码:
38: 00100110
+
-25:10011001
补码:
38: 00100110
+
-25:11100111
=
13: 00001101(补码)->00001101(原码)