首先:正数的源码、反码、补码都相同。
一、负数的源码和补码的相互转换
①:负数的源码转换为补码:1、先转换为反码(符号位不变,数值位按位取反)2、在反码的基础上末位加一。
例如:
源码:1010 0101
反码:1101 1010
补码:1101 1011
②:负数的补码转换为源码:符号位不变,数值位按位取反,末位加一。
例如:
补码:1110 1011
补码取反:1001 0100
源码:1001 0101
二、负数的反码和补码的相互转换
①:负数的反码转换为补码:末位加一
例如:
反码:1100 1110
补码:1100 1111
②:负数的补码转换为反码(源码的反码):末位减一
例如:
补码:1100 1110
反码:1100 1101 (借位减)
三、(用不同的方式解释位组合)计算机存储数据以补码的形式,并且是以补码形式运算(二进制补码形式表示有符号整数的原理)
问题提出:
0表示正,1表示负,那么8位二进制数能表示的范围就是 -127(1111 1111)~ +127(0111 1111),但是这种方法的缺点就是有一个 +0(0000 0000),一个 -0(1000 0000),这很容易混淆,而且用两个位组合来表示一个值也有些浪费。
问题解决:
二进制补码方法避免了这个问题,是当今最常用的系统。下面以8位二进制数,(也就是1字节)为例,讨论这种方法。(以下都是二进制补码的方法!!)
要实现的效果肯定就是范围为-128 ~ 0 ~ +127。
①:正数部分:二进制补码仍然是高阶位为0,以1字节中的后7位表示0 ~ 127。
②:负数部分:
1、二进制补码以该二进制表示方式下的无符号整数2^x(x指该表示法下所包含的位数,比如当前讨论的就是8位二进制数表示法)减去你所想知道的负数原码的正数形式(就是把高阶位由1改为0)然后你就能得到该负数所对应的在计算机中的二进制补码表现形式。
示例:
(一):想要知道-1的二进制补码形式,就可以用1 0000 0000 - 0000 0001 = 1111 1111,所以-1的二进制补码表现形式就是 1111 1111.
2、当然如果你想验证你眼前的这个负数的位组合的值到底是负多少,只需用2^8 - 该位组合就可以得到该负值的量(注意这里说的是量!,表现为一个无符号形式的二进制位)。然后你就知道这个负数的位组合代表负啥了。
示例:
(一):想要知道 1000 0000 这个负数位组合是负多少,就可以用 1 0000 0000 - 1000 0000 = 1000 0000(无符号整数128),所以1000 0000这个负数位组合就是-128的二进制补码表现形式。
(二):想要知道 1000 0001 这个负数位组合是负多少,就可以用 1 0000 0000 - 1000 0001 = 0111 1111(无符号整数127),所以1000 0001这个负数位组合就是-127的二进制补码表现形式。
这样就能达到所要的效果
其实要得到负数的二进制补码表现形式,最好的方法是
(首先先得到它对应相反数的二进制补码表现形式,然后反转每一位,然后加1,就得到了)
《原先的1000 0000(负0)(正128)变成了-128的补码,1000 0001(负1)(正129)变成-127的补码》
《而1111 1111(负127)(正255)变成了-1的补码》
故而范围为-128 ~ 0 ~ +127
就是说数字0 ~ 127代表它们本身,而数字128到255代表负数
如:
128(无符号整数表示形势下)(1000 0000)(由原来表示法中的-0 变成了 -128)
129 (1000 0001) (由原来表示法中的-1 变成了 -127)
扩展:还有一种表示方法就是二进制反码方法:
通过反转位组合中的每一位形成一个负数。例如,0000 0001是1,那么1111 1110就是-1,这种方法也有一个-0,1111 1111。(当然+0也是有的),该方法表示范围为-127 ~ +127。
参考这个链接
该链接中的第五点内容看我的,别看他的,他的错了(看了你会晕的!!)