public static String toBinaryString(int i)
//以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
//如果参数为负,该无符号整数值为参数加上 2^32;否则等于该参数。
System.out.println(Integer.toBinaryString(-1)) ;
System.out.println(Integer.toBinaryString(2)) ;
System.out.println(Integer.toBinaryString(1)) ;
输出:
11111111111111111111111111111111
11111111111111111111111111111110
1
结论输出的是数字的二进制补码。
于是我对这个方法的作用解释很不理解,为什么说是以 二进制无符号整数形式 返回一个 整数类型的字符串,为什么 如果参数为负数,就要加上 232 次方?
因为Java里的int是有符号的,在内存中没有正负之分,只有0/1,整数是用补码表示的
正数补码等于原码
负数的补码等于其绝对值的反码+1,正好等于自身+2^32(对于4字节的整型来说)
-1
的补码 就是绝对值1
的反码(按位取反)11111111 11111111 11111111 11111110
再+1
等于
11111111 11111111 11111111 11111111
这样正好能把最高位为1的数字用来表示负数,而最高位为0的数字表示非负数
因此
负数+2^32
之后的二进制串,就是该负数内存中准确的存储形式