、、有一个数字 125 、、看看我变的对不对、125的二进制是 01111101最高位变成1 然后取反10000010
、、有一个数字 125 、、看看我变的对不对、125的二进制是 01111101最高位变成1 然后取反10000010
、、有一个数字 125 、、看看我变的对不对、
125的二进制是 01111101
最高位变成1 然后取反
10000010
、、有一个数字 125 、、看看我变的对不对、125的二进制是 01111101最高位变成1 然后取反10000010
首先,原码反码补码对于正数来说,都是同样的.
这个题目里,两个数都是负数.
对于计算机来说,做负数的加减法比较麻烦,硬件实现不方便,
所以引进了补码和反码表示法,直接用加法以方便计算机的计算.
刚刚我说过,正数原码反码补码表示相同,
那么算负数的时候怎么变成可以直接加起来呢?
先打个比方,按时间12个小时来算
现在的准确时间是4点
有一个表显示的是7点
要校准时间,我们可以将时针退7-4=3格,也可以向前拨12-3=9格
计算机做减法就可以转化成-3=+9
LZ也给了原码反码补码的定义,不过本人认为这些公式比较难记,
正数就不说了,教你算负数:符号位为1代表负数
原码:如果按LZ给的4位表示的话,3用二进制则为0011(对应权值分别为8421,因为3=2+1,所以8和4对应的位为0,2和1对应的为1.同理可以得到6二进制表示为0110)
那么-3的原码就将第一位符号位0改为1,即1011,-6为1110
反码:符号位不变,其他位求反(0变为1,1变为0)
-3的反码:1|011——>1|100,-6的反码1|110——>1|001
补码:反码尾数加1
-3的补码:1100尾数加1——>1|101,1001尾数加1——>1|010
求出了对应的补码,把两个数加起来最后得到LZ的结果是没有问题的.
但是为什么两个负数相加最后结果是正数呢
不知道LZ注意到没有,-3和-6的补码符号位都是1,它们加起来的时候势必要进位,便从1成为0了,成为正数,这叫溢出,因为你给的表示法是4位的,且最高位为符号位,等于说最高位的权值8不能参与数值运算,那么该4位的数值表示范围内,只有4、2、1这三个权值,能表示的最大值是7而已,就像我们刚才举的钟表例子,等过了12点,钟表又回到了1、2、3……
如果我们换种表示法:用5位,最高位是符号位,0表示正数,1表示负数.剩下的四位还是依旧对应权值8421,那么-3的原码为10011——>反码11100——>补码11101,-6原码——>10110——>反码11001——>补码11010
1|1101+1|1010=11|0111(注意这里的符号位产生了进位,也就为最高位的两个1)
再将11|0111变为原码11|1001,剔除符号位11表示负数外,1001按权值8421对应为8+1=9,这样我们就正确表示为-9了.