Java中有八大基本数据类型
byte类型:
byte类型,使用一个字节存放一个数据,一个字节占八位,所以它取值范围是:
1000 0000 ~ 0111 1111(-128-127)
为什么不是0000 0000 ~ 1111 1111呢?
我们都知道1111 1111 是负数的最大值,因为负数在电脑中的存储是用(该数值的绝对值的反码+1表示)而最高位是符号位,1表示负数,0表示正数。所以0111 1111表示正数最大值(换算十进制为127)而负数最大值是1111 1111(按照反码换算成十进制后为-1),负数最小值为1000 0000(换算后为-128)
负数换算规则:负数的二进制=负数绝对值的二进制取反码+1。
例如:-5
-5的绝对值:5
5的二进制是:0000 0101
0000 0101的反码:1111 1010
1111 1010加1:1111 1011
short类型
short类型,使用两个字节存放一个数据,两个字节16位二进制表示,那么它的取值范围就是:
1000 0000 0000 0000 ~ 0111 1111 1111 1111(-32768-32767)换算同上述byte类型。short类型使用时除了要注意取值范围之外重要的一点就是在运算时需要注意,看如下代码:
short number1,number2,sum;
number1 = 120;
number2 = 300;
sum = number1+number2;
猛一看,你会发现这没有问题呀,可是你知道在运算时short类型会转换成Integer类型的话,那么这个就会出现错误,Java编译器会报错,你们可以去试一下,包括其他的运算。正确的做法应该如下:
sum = (short) (number1+number2);//(short)进行强制类型转换。
short是smallnumber类型,但算式右边的运算结果是Integer类型,所以无法进行隐式转换。
int类型
int类型,在Java中使用的是四个字节保存一个数据,一共是32为二进制表示,同上述的一样,取值范围:1000 0000 0000 0000 0000 0000 0000 0000 - 0111 1111 1111 1111 1111 1111 1111 1111
(-232~231)
long类型
long类型是Java的基础类型,使用8个字节存储一个数值,一共是64位二进制数。取值范围是(-2^64-2^63)
float类型
float类型是Java的基础数据类型之一,用四个字节表示一个浮点数.第一位是符号位,第二位到第九位表示指数,一共八位,其中八位有一位是指数的符号位,所以指数取值范围是(-128-127)又因为全0和全1作为特殊处理,所以最终表示范围是(-127-126)。去掉前九位,那么就剩下23位,那么这23位表示小数部分。这里23位表示了24位的数字,因为有一个默认的前导1(只有二进制才有这个特性)。精度为7位。(具体指数占多少位,尾数占多少位,由计算机系统决定。)
最后结果是:(-1)^(sign) * 1.f * 2^(exponent)
这里:sign是符号位,f是23bit的小数部分,exponent是指数部分,最后表示范围是(因为正负数是对称的,这里只关心正数)
2^(-126) ~~ 2(1-2^(-24)) * 2^127
这个还不是float的取值范围,因为标准中还规定了非规格化表示法,另外还有一些特殊规定.
非规格化表示:
当指数部分全0而且小数部分不全0时表示的是非规格化的浮点数,因为这里默认没有前导1,而是0.
取值位0.f * 2^(-126),表示范围位 2^(-149)~~ (1-2^(-23)) * 2^(-126) 这里没有考虑符号.这里为什么是-126而不是-127? 如果是-127的话,那么最大表示为2(-127)-2(-149),很显然2^(-127) ~~2^(-126) 就没法表示了。
其他特殊表示
1.当指数部分和小数部分全为0时,表示0值,有+0和-0之分(符号位决定),0x00000000表示正0,0x80000000表示负0.
2.指数部分全1,小数部分全0时,表示无穷大,有正无穷和负无穷,0x7f800000表示正无穷,0xff800000表示负无穷.
3.指数部分全1,小数部分不全0时,表示NaN,分为QNaN和SNaN,Java中都是NaN.
可以看出浮点数的取值范围是:2^(-149)~~(2-2^(-23))*2^127,也就是Float.MIN_VALUE和Float.MAX_VALUE.
double类型
double类型占8个字节,一共是64位二进制表示。数符加尾数占48位,指数符加指数占16位.取值换算方式和float的换算方式一样。但是在使用float和double时最好先分析好目标数据的精度和性能要求,如果能够使用float满足的坚决不适用double,因为double类型使用内存占用是float的两倍,运算速度远不如float。
char类型
char在java中占据两个字节,即用16位表示一个char类型的数据。由于char是无符号的所以其表示范围是0-65536.当计算超过其表示范围时,系统会自动将结果转换为int类型。
boolean类型:
boolean类型占用一个字节,八位二进制表示。boolean类型只有两个值true和flase。