用户:
爵士OIer查看:61 回复:12 评论:5 创建时间:2019-10-04T19:26:48
尤其是补码,书上说的和我已按算出来的不一样,我没发现任何问题
爵士OIer书上说补码表示的范围最广,比如说8位的2进制,补码是-128~+127可是我算了一下,128的原码是010000000,-128原码是110000000,-128反码101111111补码110000000、那么这是怎么一个回事呢?搞不明白解释一下,然而-127的原码应该是11111111,反码10000000,补码10000001-126补码10000002,-125是补码10000003…………但是补码10000000就没有原码了啊,因为再减就没了,化简不出来了,-128的补码是个9位数
点赞0
评论
计算机只能计算加法、按位取反和移位,不能直接计算其它种类的运算,包括减法。补码和反码概念的提出动机就是把减法设法转换为另一种加法,也就是想办法把负数转换成某个有特殊符号位的正数,使转换后的数字参与运算时符合通常的数学逻辑,最后把结果重新按对应规则翻译回原码即可。
1到127和-1到-127的数都满足通常的反码和补码运算规则。但是正0、负0、正128、负128需要注意,它们的对应规则有特殊规定,不能和其它数一概而论。比如正128和负128本来在8位二进制数中是没有办法表示的。还有要设法保证正0和负0在加法中没有区别,就会发现正0和负0的补码一样,但是反码不一样,没有比较简单的补救方法。
原码和反码都可以区分正0和负0,但是补码无法区分正负0。所以补码能表示的数比原码和反码都少了1个。为了防止浪费空间,自然想到考虑能否让补码再多表示一个数。进过尝试可以发现,多出来的那个补码表示的数在加减运算中性质很像-128,但是它又不存在可以反推的原码和反码,所以一般就说补码可以表示的范围比另外两种码大1。
计算机拿到补码可以直接相加,不需要区分加减运算,效率高;加上补码比其它2种计数的编码可以多表示1个数,也节省空间。然后就这样定下来了:计算机内部采用补码记录整数。要和用户交互时,会再进行编码转换和进制转换,内部存储和运算都是直接撸二进制补码。应该是《计算机文化基础》里的东西,n久没学了。
谢谢!