真值,原码,反码,补码和移码 释义
发布日期:2021-07-01 05:47:20 浏览次数:2 分类:技术文章

本文共 1219 字,大约阅读时间需要 4 分钟。

简单定义

  • 真值:

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

比如: 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等其他高级语言中使用的都是原码。

转载地址:https://oscar.blog.csdn.net/article/details/8928789 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:[Ext JS6实战] Ajax获取Tree Store
下一篇:Javascript 时间操作汇总

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月22日 02时09分12秒