最近学习了java的一些知识,对其中一些东西有自己的理解,发表出来希望得到大神的帮忙指正。
一:关于java中的枚举类
这是一个关于枚举类的小程序:
public class EnumTest {
public static void main(String[] args)
{Size s=Size.SMALL;
Size t=Size.LARGE; //s和t不是引用同一个对象
System.out.println(s==t); //输出的为false ,只有int和float才是原始数据
System.out.println(s.getClass().isPrimitive()); //从字符串中转换
Size u=Size.valueOf("SMALL");
System.out.println(s==u); //true ,输出为BOOL类型
for(Size value:Size.values()){System.out.println(value);}}} //列出它的所有值
enum Size{SMALL,MEDIUM,LARGE};
运行的结果为:,枚举就是将每一个对象都列举出来,枚举类型可以用于switch中,枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象,可以使用“==”和equals()方法直接比对枚举变量的值。
二:关于反码补码和原码的基础知识
1.机器数:我们知道在计算机中数字都是2进制,只有0和1,而且一般被表示为8位数,最高位表示符号也就是正负,0为正,1位负。例如在计算机中表示-3=10000011,正3就是00000011,这里100000011和00000011就机器数。
2.原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值,比如将100000001装换成十进制的数就是-1,所以-1和100000001就是原码,注意第一位是符号表示正负,所以8位2进制的取值范围就是11111111到01111111。
3.反码:正数的反码就是其本身,负数的反码就是在其原码的基础上, 符号位不变,其余各个位取反。比如-1的原码为100000001,其反码就是111111110。注意符号位不能改变。
4.补码:正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
例如:[+1] = [00000001]原 = [00000001]反 = [00000001]补 [-1] = [10000001]原 = [11111110]反 = [11111111]补
在java中是使用补码来表示数字的。
三:关于浮点数的基础知识
浮点数在计算机中是使用科学计数法来表示的,即使用尾数(也就是有效数字),一个指数,一个基数,和一个表示符号位的数来表示的。例如128.56在计算机中的表示为1.2856*10^2,1.2856就是尾数,10就是基数,2是指数。
IEEE浮点数:
计算机中使用有限的连续字节保存浮点数的。在IEEE标准中,浮点数就是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域,和尾数域三个域,其中保存得值分别用于表示给定二进制浮点数中的符号,指数和尾数,这样通过尾数和可以调节的指数就可以表达给定的数值了。
两种基本的浮点格式:
IEEE单精度格式具有24位有效数字精度,共占用32位。
IEEE双精度格式具有53为有效数字精度,共占用64位。
其中float的存储方式如下图所示:
而double的存储方式为:
下面我就这个基础知识点来解决一个我们的一个疑惑,请看下面一段程序,注意观察输出结果
float f = 2.2f;
double d = (double)f;
System.out,println(d.ToString("0.0000000000000"));
f = 2.25f;
d = (double)f;
System.out,println(d.ToString("0.0000000000000"));
可能输出的结果让大家疑惑不解,单精度的2.2转换为双精度后,精确到小数点后13位后变为了2.2000000476837,而单精度的2.25转换为双精度后,变为了2.2500000000000,为何2.2在转换后的数值更改了而2.25却没有更改呢?很奇怪吧?其实通过上面关于两种存储结果的介绍,我们已经大概能找到答案。首先我们看看2.25的单精度存储方式,很简单 0 1000 0001 001 0000 0000 0000 0000 0000,而2.25的双精度表示为:0 100 0000 0001 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000,这样2.25在进行强制转换的时候,数值是不会变的,而我们再看看2.2呢,2.2用科学计数法表示应该为:将十进制的小数转换为二进制的小数的方法为将小数*2,取整数部分,所以0.282=0.4,所以二进制小数第一位为0.4的整数部分0,0.4×2=0.8,第二位为0,0.8*2=1.6,第三位为1,0.6×2 = 1.2,第四位为1,0.2*2=0.4,第五位为0,这样永远也不可能乘到=1.0,得到的二进制是一个无限循环的排列 00110011001100110011... ,对于单精度数据来说,尾数只能表示24bit的精度,所以2.2的float存储为:
但是这样存储方式,换算成十进制的值,却不会是2.2的,应为十进制在转换为二进制的时候可能会不准确,如2.2,而double类型的数据也存在同样的问题,所以在浮点数表示中会产生些许的误差,在单精度转换为双精度的时候,也会存在误差的问题,对于能够用二进制表示的十进制数据,如2.25,这个误差就会不存在,所以会出现上面比较奇怪的输出结果。