问 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