以8b为例对比如下:(谁能给我补补课,说说为什么是正0负1,按照我的理解应该是正1负0更符合人类的思维,前者是进行了一次技术上的mapping了)
正号:0
负号:1
原码:
+1 0 000 0001
-1 1 000 0001
反码:
+1 ...
-1 1 111 1110
补码:
+1 ...
-1 1 111 1111
1+(-1)=0
0 000 0001
1 111 1111
------------
10 000 0000 = (+0)
而如果反过来就会是这样的:
正号:1
负号:0
原码:
+1 1 000 0001
-1 0 000 0001
反码:
+1 ...
-1 0 111 1110
补码:
+1 ...
-1 0 111 1111
1+(-1)=0
1 000 0001
0 111 1111
------------
10 000 0000 = (溢出位 8b考虑为 +0)
20090601:
相关链接:
http://dev.csdn.net/develop/article/17/17680.shtm
逆向推理:
先有正数运算,再有负数,才会产生有符号运算所遇到的问题。
按照离散数学的原理,需要解决的问题有两个:
1、负0怎样才能和正0具有相同的标志;
2、其他负数如何确定各自的标志;
3、运算规律是否可行;
下面给出我的推导过程及最后的公式,我觉得 原码和反码的转换公式要比以前我看到的教程简单很多。
一、拿二位10进制为例
可得排列组合(标志)为00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19 共计2*10^1 = 20 个数,为正数1~9 、 0 、和负数10个。(因为正数和0在负数概念出现以前已经确定,所以剩下的数为负数)。
二、拿二位2进制为例
同理有标志00 01 10 11,00为+0,01为+1,推理另两个标志对应的负数。
结论 :
同样的方法可以放到三位二进制 ,四位二进制等,表示为x位n进制可得到公式:
负数原码和补码的转换公式:
1v = -(n^(x-1)-v)
放到8位2进制即:
1v=-(2^7-v)
代入8位二进制即使
1000 0000 = - (2^7-0)= -128;
1000 0001 = -(2^7-1) = -127;
1000 0002 = -(2^7-2) = -126;
...
1111 1111 = -(2^7-(2^7-1)) = -1;
"-1就是减1嘛,想一想00000000减去1应该是多少呢,不够就借位,那就是11111111"
这句话同样体现了前提:不破坏先前的正数(包括0)的运算法则。
总 结:那些计算机教材写得真垃圾啊,就这么简单的问题搞锤子求反+1 ,基本上无逻辑可言。
结合离散等数学知识,这个问题是不是可以延伸到内存寻址等相关方面呢?