码迷,mamicode.com
首页 > 其他好文 > 详细

原码,补码,反码

时间:2016-08-09 00:23:18      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

原码,补码,反码,这东西在我刚开始学习java的时候困扰了我好一会,看书本上的说法总感觉缺点什么

究其因归结为一个问题:1000 0101为什么不是-5?

1) 后来查了资料,自己梳理了下,理清楚了,在计算机中,系统统一使用补码来表示和存储,原因在于通过这种规则可以将符号位参与逻辑运算,于是有了以下两条规则

① 正数: 补码 = 反码 = 原码

② 负数: 补码 = 反码 + 1, 反码 = 该负数对应的正数原码最高位取1

 

2) 下面主要说明负数的补码换算过程,就以-5为例:

① 5的原码0000 0101,最高位取1,得到-5的原码1000 0101

② 最高位不变,其他位取反,得到-5的反码1111 1010

③ 反码 + 1,得到-5的补码1111 1011,所以-5的补码是1111 1011

 

3) 那前面问题中的1000 0101究竟是什么?我们不妨逆推下

① 1000 0101是一个负数的补码,减1,得到它的反码为1000 0100

② 那它的原码为最高位不变,其余位取反,得到1111 1011

③ 则该负数对应的正数原码为0111 1011,换算成十进制为2^6 + 2^5 + 2^4 + 2^3 + 2^1 + 1 = 123

因此1000 0101为-123,而非-5,只要记住一点,我们所看到的负数并非真正的负数,而是负数的补码形式,要换算成原码才是它真正的值

 

4) 我们还需要注意几个点

① 0的补码为0000 0000,-128补码为1000 0000(同理还有-2^15等)

② 正数的补码 + 该正数对应负数的补码 = 0000 0000

-5:  1111 1011

  5:  0000 0101

两者之和为0000 0000,满足数学运算逻辑

 

原码,补码,反码

标签:

原文地址:http://www.cnblogs.com/windyrain/p/5751383.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!