一个关于补码的有趣的例子

来源:互联网 发布:全职猎人 知乎 编辑:程序博客网 时间:2024/06/08 05:59

问    Math.abs(-2147483648)的返回值是什么?

答    -2147483648表示的int整形的最小负值,其16进制表达为0x80000000, 当求其绝对值时,先将其按位取反,得到0x7f ff ff ff,

        然后加1,得到0x80000000,表示为十进制仍然为-2147483648。

附注

       在计算机中,数据均使用补码表示。什么是补码呢,先了解原码,反码定义。

        原码,最高位为符号位,0表示正数,1表示负数,其余低位表示绝对值。比如

       10的原码为 (00000000 00000000 00000000 00001010),

       -10的原码为(10000000 00000000 00000000 00001010).

        反码,最高位为符号位,同上表示,正数的反码与其原码相同,负数的反码其绝对值位按位取反。比如  

      10的原码为  (00000000 00000000 00000000 00001010),

       -10的原码为(11111111 11111111 11111111 11110101).

       补码,最高位符号位,同上表示,正数的补码与其原码相同,负数的补码为其绝对值位按位取反,再加上1.比如  

      10的原码为  (00000000 00000000 00000000 00001010),

       -10的原码为(11111111 11111111 11111111 11110110).

    

      正数的绝对值位其补码低位,负数的绝对值为其按位取反再加1.      


      附上java源码和运行结果,

        package myAlgoth;
        public class myMain {
  public myMain() {
// TODO Auto-generated constructor stub
  }
  public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.printf("%d\n", -2147483648);
System.out.printf("%d", Math.abs(-2147483648)); 

}
     }

     结果为:

     -2147483648
     -2147483648

    

       

   

原创粉丝点击