本帖最后由 球球_ 于 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的最小值,这样我们就能推导出来,而不是只需要记住其表示最小值。
|