十进制数 | 二进制原码 | 二进制补码 |
---|---|---|
127 | 01111111 | 01111111 |
126 | 01111110 | 01111110 |
… | … | … |
2 | 00000010 | 00000010 |
1 | 00000001 | 0000001 |
0 | 00000000 | 00000000 |
-1 | 10000001 | 11111111 |
-2 | 10000010 | 11111110 |
… | … | … |
-126 | 11111110 | 10000010 |
-127 | 11111111 | 10000001 |
-128 | 111111111 | 10000000 |
特点
1.在一个数的二进制的最高位的前面一位(这里的开头第一位)加上0表示正数,加上1表示负数。
2.正数的补码 = 它的原码 = 它的反码。
3.负数的补码的求法有两种(本质是一种):
first method>:1.先求出负数绝对值(正数)的二进制表示形式;2.从此二进制数的后边往前搜索,遇到第一个数码1后,此数码1前面的数码全部取其反码,此数码1后面(包括其本身)不变;
– >>这是我们编程实现时常用的方法。 例题
second method>:处理负数的原码,把负数的符号位(这里的开头第一位)不变,数值位(符号位的后面)依次取反,末尾加一。
– >>书上的定义
补码的意义和运算:
我们运算的时候都是用的每个数的补码进行加减
补码存在的意义就是为了统一计算机加减
比如(7)+(-7)=0
7 -> 0000 0111(7的补码)
-7 -> 1111 1001(-7的补码)
所以相加为1 0000 0000(进位 – 超出的最高位默认去掉)
比如(2)+(-3)=(-1)
2 -> 0000 0010 (2的补码)
-3 -> 1111 1101 (-3的补码)
相加为 1111 1111(-1的补码)
这样我们就可以在减法运算的时候,把数化为补码进行计算,这样就在计算时统一了加减。
进位和溢出
进位:由于运算结果超出来位数,最高位有效位前面的一位进位,这一自然数丢失。
溢出:由于运算结果超出了运算范围,当c6 oxr c7 == 1(也就是第7位前面的进位数和第8位前面的的进位数 不一样)表示溢出。
八进制,十六进制的补码
对于进制位大于2的进制我们都可以把它们都变成二进制再利用之前的取反加一的方法求解。