一道有意思的求绝对值的题。

今天在加群的时候,必须要回答问题才能加群,问题是Math.abs(~2018),这道题第一眼看比较怪,在百度了一下,后来想起了大二学的微机原理里面的原码、补码、反码的知识,现在就简单的分析一下这个问题。

第一先要了解整形在计算机中是4个字节的,一个字节8位,所以整形一共32位。

先举个一个简单的例子,就是Math.abs(~10)

10的二进制是 00000000 00000000 00000000 00001010

~10的二进制是  11111111 11111111 11111111 11110101 ,符号位为1所以~10是负数,

第二要了解,负数在计算机中是以其原码的补码存在的,通俗理解就是原码的反码加1,

~10的原码就是 11111111 11111111 11111111 11110101 

~10的原码的反码就是  10000000 00000000 00000000 00001010

~10的原码的反码+1(~10的补码)  10000000 00000000 00000000 00001011 

10000000 00000000 00000000 00001011 为-11

所以Math.abs(~10)=Math.abs(-11)=11

同理Math.abs(~2018)=Math.abs(-2019)=2019

第三点,取反≠反码

posted @ 2017-02-14 19:49  dirk_jian  阅读(225)  评论(0编辑  收藏  举报