今天在加群的时候,必须要回答问题才能加群,问题是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
第三点,取反≠反码