Java API 查看数值怎么存储及由存储还原为数值

介绍

如果你正研究整数,小数怎么存储的, 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大勇学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值