负数的源码和补码的相互转换以及反码和补码的相互转换以及⼆进制补码形式表
⽰有符号整数的原理
⾸先:正数的源码、反码、补码都相同。
⼀、负数的源码和补码的相互转换
①:负数的源码转换为补码: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 0000这个负数位组合就是-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。
该链接中的第五点内容看我的,别看他的,他的错了(看了你会晕的!!)