您的位置:首页 > 其它

真值,原码,反码,补码和移码 释义

2013-05-15 20:00 351 查看


简单定义

真值:

正数或负数的真值为其绝对值对应的二进制数前面加上正号或负号。

比如: 2的真值为+00000010

-2的真值为-00000010

(其中正号可以省略)

原码:(原码的第一位表示符号位,0表示正,1表示负)

正数的原码为对应的二进制数, 如2的原码为00000010

负数的原码为其绝对值对应的二进制数的第一位变为1,如-2的原码为10000010

反码:

正数的反码与其原码相同

负数的反码是对其原码逐位取反,符号位除外。

补码:

正数的补码与原码相同

负数的补码是在其反码的末位加1

移码:

移码是对补码的符号位取反得到的

以8位二进制数为例:

2 -2

真值 00000010 -00000010

原码 00000010 10000010

反码 00000010 11111101

补码 00000010 11111110

移码 10000010 01111110


为什么要使用原码,反码,补码 ?

原码:

日常生活中,我们使用十进制来表示一个数, 如果是负数的话,我们就在数的前面加一个符号( “-”)。

但是在计算机中,只能识别0 和 1。(类似脉冲的变化.....).

这样的话,就需要使用二进制的方式来表示数。

对于负号的识别方面,用一个二进制数的最高为存放符号(0为正, 1为负), 这样就产生了机器数的原码了。

反码:

在使用原码进行计算时, 比如:

十进制  (1) 10 - (1)10 = (1)10 + (-1)10 = (0)10

二进制  (0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 )
很显然,这个结果是错误的。这样得到一个结论,涉及到负数的加法时,使用原码进行加减是有问题的。

于是乎, 尝试使用反码进行运算:

(0 0000001)反 + (1 1111110)反 = (1 1111111)反 = (1 0000000)原 = ( -0 )

看上去接近了, 但还是有问题,结果应该是(+0)

(+0)和(-0)上,在人们的计算概念中零是没有正负之分的。于是就引入了补码的概念

补码

负数的补码就是对反码加一,而正数的补码不变,正数的原码反码补码是一样的。在补码中用(-128)代替了(-0),这个是人为规定的,所以补码的表示范围为:

(-128~0~127)共256个。

(0 0000001)补 + (1 1111111)补 = (0 0000000)补 = ( 0 )

这下正确了。

所以补码的设计目的是:

⑴ 使符号位能与有效值部分一起参加运算,从而简化运算规则。补码机器数中的符号位,并不是强加上去的,是数据本身的自然组成部分,可以正常地参与运算。

⑵ 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。

所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、c等其他高级语言中使用的都是原码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: