介绍
如果你正研究整数,小数怎么存储的, java 提供了API 用于显示整数,小数存储后的二进制是什么样子的,以及由这些二进制解析为整数,小数值。这样你可以看下自己推出的和API得出的值是否一致。
我们知道,数值存储在计算机中肯定是二进制的形式, 整数以补码的形式存储, 小数以IEEE 754标准存储。
整数的存储表示
-
Integer.toBinaryString()
int num1 = 1; int num2 = -1; String binaryString1 = Integer.toBinaryString(num1); // int占32位,补齐32位(因为 toBinaryString 会省略前导0) binaryString1 = String.format("%32s", binaryString1).replace(' ', '0'); System.out.println(binaryString1); // 输出: 00000000000000000000000000000001 String binaryString2 = Integer.toBinaryString(num2); System.out.println(binaryString2); // 输出: 11111111111111111111111111111111
从存储的形式解析为表示的整数
- parseUnsignedInt(String s, int radix)
String binaryStr1 = "1";
// String binaryStr1 = "00000000000000000000000000000001"; // 这样也可以
String binaryStr2 = "11111111111111111111111111111111";
int result1 = Integer.parseUnsignedInt(binaryStr1, 2);
int result2 = Integer.parseUnsignedInt(binaryStr2, 2);
System.out.println(result1); // 输出: 1
System.out.println(result2); // 输出: -1
float的存储表示
float float1 = 3.14f;
float float2 = -3.14f;
// 查看float存储后的二进制表示
int floatBits1 = Float.floatToIntBits(float1);
String binaryStr1 =Integer.toBinaryString(floatBits1);
// float占32位
String binaryStr1Full = String.format("%32s%n", binaryStr1).replace(' ', '0');
System.out.print(binaryStr1Full);
// 输出: 01000000010010001111010111000011
int floatBits2 = Float.floatToIntBits(float2);
System.out.println(Integer.toBinaryString(floatBits2));
// 输出: 11000000010010001111010111000011
可以看到3.14和-3.14只有符号位有差别
1: 01000000010010001111010111000011
-1: 11000000010010001111010111000011
解析为float:
// 从存储的二进制字得到float
String floatBinary1 = "1000000010010001111010111000011";
String floatBinary2 = "11000000010010001111010111000011";
int floatBits1 = Integer.parseUnsignedInt(floatBinary1, 2);
float floatValue1 = Float.intBitsToFloat(floatBits1);
System.out.println(floatValue1); // 输出: 3.14
int floatBits2 = Integer.parseUnsignedInt(floatBinary2, 2);
float floatValue2 = Float.intBitsToFloat(floatBits2);
System.out.println(floatValue2); // 输出: -3.14
double的存储表示
double double1 = 3.14;
double double2 = -3.14;
long doubleBits1 = Double.doubleToLongBits(double1);
String binaryStr1 = Long.toBinaryString(doubleBits1);
String binaryStr1Full = String.format("%64s%n", binaryStr1).replace(' ', '0');
System.out.print(binaryStr1Full);
// 输出: 0100000000001001000111101011100001010001111010111000010100011111
long doubleBits2 = Double.doubleToLongBits(double2);
System.out.println(Long.toBinaryString(doubleBits2));
// 输出: 1100000000001001000111101011100001010001111010111000010100011111
解析为double:
String doubleBinary1 = "0100000000001001000111101011100001010001111010111000010100011111";
String doubleBinary2 = "1100000000001001000111101011100001010001111010111000010100011111";
long doubleBits1 = Long.parseUnsignedLong(doubleBinary1, 2);
double doubleValue1 = Double.longBitsToDouble(doubleBits1);
System.out.println(doubleValue1); // 输出: 3.14
long doubleBits2 = Long.parseUnsignedLong(doubleBinary2, 2);
double doubleValue2 = Double.longBitsToDouble(doubleBits2);
System.out.println(doubleValue2); // 输出: -3.14