原码与补码的转换
原码与补码的转换
[-3]反=[10000011]反=11111100
原码 反码
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1.
[-3]补=[10000011]补=11111101
原码 补码
也就是说原码转换成补码是先原码 反码 最后+1成补码.
那么补码转换成原码呢?我看了个视频有点迷惑.
是怎么说的:
由于计算机内部通常用补码来表示二进制数.
正数的补码为自身,对于负数来说,需要将补码转换成原码.
转换的过程分2步:
1.要将这个2进制数所有位反转.
2.第二步是在它的末尾加1
一个是补码转换成原码,一个是原码转换成补码.
到底哪个错了呢?还是都是对的?
一个是教学视频
第4章 7.整型概述 观看时间为中间 时间不长
两个说法都没有错,我们举个例子来看看就明白了:
1、10001的补码是取反后在再加1,也就是11110+1=11111;
2、如果是11111变回原码呢?我们可以采取逆过程先减1,11111-1=11110,再取反变为10001;
3、如果要是在补码变原码时先去反再加一呢?(就是问题中的说法)结果为11111先取反为10000,再加1,10000+1=10001.这个结果与2是一样的,并且也是和1中的原码相吻合.
通过上述例子可以看出,无论是原码变补码还是补码变原码,都可以采取先取反再加1的方法.至于原因是很容易想通的.
按照正常思维来想的话,补码变成原码应该是原码变补码的逆过程,也就是2步中的方法.但是我们可以思考一下,如果我们没有按照2步中的方法而是先去取反了呢?先取反得到的结果和2步的结果有什么差异呢?答案是差了1,2步中是先减1才取的反,而直接取反的话,就没有减1.
接着请注意,在取反前减1和在取反后加1的效果是一样的.这就和-3-1=-(3+1)是一个道理.
所以问题中的说法没有错误.