猫史档案馆


【我去】原码反码补码搞的晕掉了

用户:爵士OIer爵士OIer查看:61 回复:12 评论:5 创建时间:2019-10-04T19:26:48


尤其是补码,书上说的和我已按算出来的不一样,我没发现任何问题


回复

上一页第 1 页 / 共 1 页下一页
急_开_锁_办_证810864急_开_锁_办_证810864

你举个例子?

点赞0


评论


爵士OIer爵士OIer

10000000这是个补码

点赞0


评论


爵士OIer爵士OIer

但是好像不太可能

点赞0


评论


爵士OIer爵士OIer

于是和书上的出现了歧义

点赞0


评论


爵士OIer爵士OIer

书上是说有这个补码的

点赞0


评论


爵士OIer爵士OIer

但没法减了,复原原码不起来

点赞0


评论


爵士OIer爵士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久没学了。

谢谢!


爵士OIer爵士OIer

撒地方

点赞0


评论


爵士OIer爵士OIer

求助啊!

点赞0


评论


爵士OIer爵士OIer

知道了,谢谢

点赞0


评论


爵士OIer爵士OIer

之前问了老师,他太忙一直没回答

点赞0


评论


爵士OIer爵士OIer

https://teacher.zjut.cc/t451679/

陈琰宏

就是这个人

点赞0


评论