A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 球球_ 于 2015-9-8 23:03 编辑

x + ~x = -1)快速由负数的补码推出负数的数值!!!【原创by球球】

    当我们学习负数的原码,反码,补码的时候会比较疑惑,推倒来推到去结果就弄错了,这里教大家一个小技巧,可以由负数的补码快速的算出负数的值:
    先说说负数怎么由原码推出补码,记忆口诀:按位取反再加1
      举个例子,某个负数原码为      10000000 10110101 00111001 01010011
      按位取反得反码             11111111 01001010 11000110 10101100
      1得补码                 11111111 10110101 11000110 10101101
    这样子我们就算出了一个负数在计算机中的2进制存储数(计算机都是以补码形式储存)
    实际运用中,我们都是先知道负数在计算机的存储(也就是补码),再去计算这个负数的值。
这就需要我们反过来推导,有些同学就会疑惑,而且每次都经过写出补码推导反码,反码再推导原码,由原码再计算数值,太麻烦啦!!!!
另外100000000 00000000000000 0000000这个数,老师教导我们记住表示最小,因为上面的方法也不好推导,补码推反码的时候先减去1得多少?最后一位是0,需要向前借位,直到符号位,但符号位是不能借位的,怎么办?…所以老师只说让我们记住等于最小,可是却让人更疑惑了。
当我们学习位运算的时候,有一个计算方式叫取反~,取反和原码推导反码多么相似!!我们能不能利用它来计算呢?
当然可以!
我们记住一个公式:x + (~x)= -1
为什么会这样呢,我们来推导一下,假如一个数x,其在计算机中的补码为
10010101 1100010101001011 10110111      -------1
对其取反~x得到(和原码推反码的区别在于符号位也变了):
01101010 0011101010110100 01001000   --------2
因为是取反,那么我们可以得到它们的和x + (~x)得值为
11111111 1111111111111111 11111111
经过推导,这个数的值也就是-1(实际上,不管一个数是多少,x + (~x)的值都为-1)
怎么利用这个公式来由补码推导数值呢?
假如一个负数如上面的1,我们对其取反可得到一个正数如上面的2,这时候我们就得到了一个正数的补码,计算出其数值为0110101000111010 10110100 01001000也就是十进制1782232136,再根据公式x + (~x)= -1,我们就可以计算出x的数值为- 1782232136。
怎么样,方便吧!!
    我们再利用公式推导一下100000000 0000000 0000000 00000000,取反得01111111 11111111 1111111 1111111,其为正数,数值为2147483647,那么3得数值即为-2147483648,查看一下int的取值范围(-2147483648~~2147483647),其正好是int的最小值,这样我们就能推导出来,而不是只需要记住其表示最小值。

评分

参与人数 1黑马币 +5 收起 理由
倪海营 + 5 很给力!

查看全部评分

9 个回复

倒序浏览
不明觉厉!!!
回复 使用道具 举报
太长不看
回复 使用道具 举报
大神 膜拜
回复 使用道具 举报
头看晕了~~~~~~~~~~~~~~~~~~~~~~~
回复 使用道具 举报
一起加油。
回复 使用道具 举报
厉害厉害!!
回复 使用道具 举报
已阅读,帮我也刷刷
回复 使用道具 举报
100000000 0000000 0000000 00000003,取反得01111111 11111111 1111111 1111111 表示没看懂~!
回复 使用道具 举报
Jiwei 发表于 2015-9-8 23:02
100000000 0000000 0000000 00000003,取反得01111111 11111111 1111111 1111111 表示没看懂~!

键盘敲错了,已改
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马