java基本数据类型:
1、整型
byte(1字节)、short(2字节)、int(4字节)、long(8字节)
2、浮点型
float(4字节)、double(8字节)
3、字符型
char(2字节)
4、布尔型
boolean
数据类型定义:
定义时系统会默认整型数据类型(byte、short、int、long)为int,浮点型(float、double)默认为double
如以下代码:
short num=123;
其实分为三步:
1、给int型变量 num赋值123(此时num默认为int型)
2、将num变为short型
3、得到short型变量num,值为123
如果代码是这样:
long num=10000000000;
系统就会报错,因为根据刚才的步骤,long型100亿是从int型转变过来的,又因为int型数据范围低于100亿,所以会报错。
那遇到这种情况我们就要强制转换数据类型,如下:
long num=10000000000L;
在数值后面加L(为了区分,最好用大写)
这样,就定义了long型变量num
若num的数值小于int的范围,就不需要加L了
同理 定义double型也是这种情况:
double num=1.1234567890123F;
数据类型的转换:
要清楚:除了布尔型,另外七种数据类型之间是可以随意转换的(可能造成***位丢失***或***降低精确度***问题)
1、范围小的数据类型转范围大的数据类型:
直接转
short a=123;
int b=a;
Systen.out.pritln(b);
2、范围大的数据类型转范围小的数据类型:
强制转换(在需要转的变量前加(转之后的类型))
int a=123;
short b=(short)a;
Systen.out.pritln(b);
或
int a=123;
Systen.out.pritln((short)a);
大转小可能会出现缺位导致结果不正确的情况:如
int a=257;
byte b=(byte)a;
Systen.out.println(b);
输出结果为1 ????????怎么回事?这已经不是丢失精确度,而是完完全全错了,到底怎么回事?
首先
我们知道int在内存中占4字节,1字节8位,所以int为48=32位,257在内存中存储如下:
(00000000)(00000000)(00000001)(00000001)
而byte为1字节(8位)
int转为byte时,byte只会读取int的最低低8位,其余舍去,即读取为(00000001),二进制表示为1**2^0=1
但 如果数字改为120,8位可以表示完,及时舍弃前面38=24位也不影响结果,就不会出现缺位导致结果错误的情况,仔细一想,还是很容易理解的
但只要数据属于范围,就不会出现这种情况
浮点和整型之间的转换:
int转float会有精度损失,确实是这样,但int4字节,取值范围是-21亿多–21亿多,float4字节,范围±3.40282347e+38f,明显大于int的范围,为何还会有精度的损失? 就涉及到小数在计算机里的表示方法,总之,float和int都是32位,但存储方式不同,float有24位来确定精度,int有32位,所以int精度高于float,所以int转float可能有精度的损失(long与double同理,double有53位来确定精度)
比如说:
int num=123456789;
float f=num;
结果为1.23456792e8,也就是我们常说的float精确到小数后6位,double精确到15,16位由此我们也理解了int,long,float,double之间转换时精度丢失的情况*(float有23位来确定精度,int有32位来确定精度,double有53位来确定精度,long有64位来确定精度)*
总结
1、数据类型定义(默认定义的数据类型的数值在其大小范围内)
-
系统会输入的整数数值都默认为int型,小数数值都默认为double型,可以这么理解:float a=1(1为int型)float a=1.0f(1.0为double型)
-
定义整型时 (整数数值)
1 、若定义的类型范围小于int(byte、short)----------正常定义 2 、若定义的类型范围大于int(long) (1)数值未超出int范围--------------------------正常定义 (2)数值超出int范围---------------------------数值末尾加L 3 、若定义的类型为其本身(int)---------------------正常定义
-
定义浮点型时(小数数值)
1 、若定义的类型范围小于double(float)-------------数值后加f 2 、若定义的类型为其本身(double)------------------正常定义
2、数据类型的转换
-
数据类型范围大小比较:
byte(8)<short(16)=char(16)< float(24)<int(32)<long(53)<double(64) -
小到大直接转
-
大到小或同级之间
1 、数值属于范围-----直接转 2 、数值超出范围---强制转(丢失精度或缺位)