// long和float类型 加上后缀L、F 推荐大写
long l1 = 0b10L, l2 = 010L, l3 = 10L, l4 = 0x10L; // 0b二进制 0八进制 0x十六进制
float f1 = 0b10, f2 = 010F, f3 = 10F, f4 = 0x10F; // f1自动类型转换
System.out.println(l1 + " " + l2 + " " + l3 + " " + l4); // 2 8 10 16
System.out.println(f1 + " " + f2 + " " + f3 + " " + f4); // 2.0 10.0 10.0 271.0
// float f1 = 0b10F; // 二进制 标红报错 Cannot resolve symbol 'F'
运行环境
JDK 9.0.4、IDEA 2023.2
遇到问题
1、float f1=0b10F;为什么标红报错
2、f2=010F;(10)八进制=(8)十进制,为什么打印输出10.0,不是8.0
3、f4=0x10F;(10)十六进制=(16)十进制,为什么打印输出271.0,不是16.0
思考过程
存储方式
数据在计算机中都是以二进制形式存放,浮点数在内存中按科学计数法存储
float类型,4字节,共32位。1位符号位、8位指数位、23位尾数位
任何一个数的二进制科学计数法表示为 1.x * 2^n ,指数位为元数据+127,尾数位为x
进制转换
1、十进制数转换为其他进制数
整数部分:除进制数,余数倒序
除2最终一定能够得到0,算法不会无限循环下去,整数永远可以用二进制精确表示
小数部分:乘进制数取整,顺序排列,直到积中的小数部分为零,或达到所要求的的精度为止
乘2可能不能消灭小数部分,算法将会无限循环下去,小数的二进制表示有时不精确
2、其他进制数转换为十进制数,各位乘位权,再相加
3、其他进制之间相互转换,中间经由十进制,例如二进制先转为十进制,再转为八进制
开始思考
1、(10)二进制=(2)十进制:10.0 = 1* 2^1
0 1000 0000 000 0000 0000 0000 0000 0000
2、(10)八进制=(8)十进制:1000.0 = 1 * 2^3
0 1000 0010 000 0000 0000 0000 0000 0000
3、(10)十六进制=(16)十进制:1 0000.0 = 1*2^4
0 1000 0011 000 0000 0000 0000 0000 0000
先将各进制数转成十进制,再转成二进制科学计数法得到在内存中的存储
最后再由内存存储换算出数值,倒换过来还是2.0、8.0、16.0
感觉问题就是出在浮点数的存储方式上,用的科学计数法存储
long类型是整型的一种,所以将各进制整数赋值给龙类型变量没有问题
float类型是浮点型的一种,内部采用科学计数法存储
上述倒换过程,是人脑中的思考思路
是不是因为计算机中的计算过程不是上面这样的,猜的
0b10、010、0x10的内存存储方式转成浮点数的内存方式,至于是什么方式,自己也不知道