关于补码运算中取反加一以及0的唯一表示的理解
-
很多同学在学习补码与真值转化时,对于补码=符号位+【数值位】取反 +1 的运算,知道运算但不知这么运算的原理以及从何而来,对此我从补码的定义做出自己一些简单的解释,如有错误欢迎指正。
-
考虑这个问题我们首先假设补码的确定,便于计算,规定补码正数与原码相同,即【X】=X (X大于0)。假设0为0000 0000(-0在下面会讨论),+1的补码是0000 0001(假设字长是8)根据1+(-1)=0,我们可以得到(-1)补=(0000 0000)-(0000 0001)= 1111 1111(最高位溢出)。
-
因此,我们可以将0表示为(0000 0001+1111 1111),此时,假设一个正数X,他的补码根据【X】+【- X】=0 ,【- X】= (-1+1)-【X】=(-1)-【X】+1 =(1111 1111-【X】)+1 ,这时候你会发现,(1111 1111-【X】)的结果正好就是对【X】诸位取反,再加上1,就是【- X】的补码表示。也就是我们常说的,对数值位诸位取反再加一,带上符号位。
-
事实上,在机器内部,机器确实是用0减去正数的补码来得到负数的补码的。
-
最后,不难理解为什么没有负零。如果有负0,即1000 0000 ,我们会发现,(1000 0000+1000 0000)=0,即这个数的补码是其自身,且(-0+1)=1000 0000+0000 0001=1000 0001=-1,这样的运算是不合理的,而补码的运算可以包含符号位,因此0用唯一的0000 0000表示更合理。
-
同理,可以理解为什么【- X】补= -【X】补,这就是补码定义的来源。。。
-
补充:由于补码没有-0表示,遇到“将1000转化为真值”类型的题目时,按照普通的转化就得到1000=【-8】补,只不过他第四位溢出了。
这只是我自己的理解,有别的看法或者有错误的点欢迎提出和指正呀👀