目录
1、八种基本数据类型
八种数据类型分别是:(整数型) byte,short,int,long,(浮点型)float,double,(布尔型) boolean,(字符)char.
byte:
- 数据类型是8位、有符号的,以二进制补码表示的整数;
- 最大表示127 即(2^7 - 1),最小表示 -128 即(- 2^7).默认值为零.
/**
* 获取byte的最大值和最小值和默认值.
*/
public class DataTypeTest {
private static byte b; //这里并没有给b赋值,打印出来会是byte的默认值
public static void main(String[] args) {
System.out.println(Byte.MAX_VALUE);
System.out.println(Byte.MIN_VALUE);
System.out.println(b);
}
}
输出结果如下:
short :
- 数据类型是16位、有符号的,以二进制补码表示的整数;
- 最大表示32767即(2^15 - 1),最小表示 -32768即(- 2^15).默认值为零.
(和上面一样可以用Short类取到最大值和最小值)
int (默认整数):
- 数据类型是32位、有符号的,以二进制补码表示的整数;
- 最大表示2147483647即(2^31 - 1),最小表示 -2147483648即(- 2^31).默认值为零.
(用Integer类取到最大值和最小值)
long :
- 数据类型是64位、有符号的,以二进制补码表示的整数;
- 最大表示9223372036854775807即(2^63 - 1),最小表示 -9223372036854775808即(- 2^63).默认值为零.
(用Long类取到最大值和最小值)
float :
- 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- 精度:小数点后6~7位。
double(默认浮点型) :
- 数据类型是单精度、64位、符合IEEE 754标准的浮点数;
- 精度:小数点后15~16位.
char :
- char类型是一个单一的 16 位 Unicode 字符
boolean :
- 只有两个取值:true 和 false,默认为false;
- 常用作标记.
2、整数类型在java语言中的表示方法。
使用二进制表示整数类型常量。
在jdk1.7之前之前不支持使用二进制表示数值,但在jdk1.7和之后版本,可以使用 0b前缀表示二进制数字。并且可以使用 下划线 “_”来将数字分开,方便阅读。
//Jdk1.7 及之后版本呢支持使用 0b开头来使用二进制表示整型常量
byte b = (byte)0b0111_1111;
System.out.println(b)
// 输出结果: 127
使用八进制表示
// 使用前缀0 来八进制表示整数
int i = 01234_4321;
System.out.println(i)
//result :2738385
使用十进制表示
// 平常使用
int i = 123456;
System.out.println(i)
//result :123456
使用十六进制表示
// 使用前缀0x 来八进制表示整数
long l = 0x1234_5678_9abcL;
System.out.println(l)
//result :20015998343868
3、关于byte、short、int、long和float、double的最大值和最小值问题。
关于整数类型,以byte为例,其他三种short,int,long与byte类似。
byte用二进制表示时占8个bit,也就说任何byte类型数字都可以用8位二进制数字表示,即0000_0000 ~ 1111_1111 之间的数字表示byte类型可以取到的所有数字。
但是1111_1111 表示的是十进制数字255,为什么byte最大取值是127?
因为byte是由符号的,既可以表示整数也可以表示负数,因此在表示byte的8位二进制数字中第一位表示正负关系(0表示正,1表示负),剩下的7位表示数值大小.所以byte可以取到的最大值位 0111_1111 即 +127 最小可取到的值位1000_0000即-128(1111_1111 表示-1).
表示正负(第1位) | 表示数值(2~8位) |
---|---|
0/1 | 0000000~1111111 |
关于浮点型float和double的最值问题。
参考:IEEE754浮点数的表示方法
wiki IEEE754
> 要搞清楚float和double的最值和精度问题,首先要明白在IEEE754协议里浮点数转换成二进制表示的格式。
和整型一样,浮点型转为二进制表示时第一位也表正负,但是之后中间8位(double是11位是指数位)表示指数位也叫阶码,剩下的表示尾数位。
float (32位)
1bit | 8bit | 23bit |
---|---|---|
符号位 | 指数位 | 尾数位 |
double (64位)
1bit | 11bit | 52bit |
---|---|---|
符号位 | 指数位 | 尾数位 |
其实在尾数位前面应该还有一位,不过通常都表示1,所以省略未写。
其中尾数域表示的值是1.M。因为规格化的浮点数的尾数域最左位总是1,故这一位不予存储,而认为隐藏在小数点的左边。
在计算指数e时,对阶码E的计算采用源码的计算方式,因此32位浮点数的8bits的阶码E的取值范围是0到255, 偏移量127,偏移量的功能是可以将e表示成负数。
我们直接通过计算将浮点数转换成二进制机器码来看看设个公式是使用的。
上面就是浮点数求出32位机器码的过程,反过来我们也可以根据根据32位机器码来求出浮点数的大小.
我们就以32位二进制能表示的最大的数值为例(注意这个值并不是float的最大值)
求 1111_1111_1111_1111_1111_1111_1111_1111 的浮点数
32位机器码转浮点数的算法就如上面的计算过程,不过应该注意到的是
上面求到的x的绝对值和float的正值最大值并不相等
//通过float的包装类Float打印出float的最大值
System.out.println(Float.MAX_VALUE);
//result : 3.4028235E38
可以看出我们求得到的x的绝对值是float最大值的2倍,而原因是因为IEEE 754 协议的特殊规定!
IEEE 754协议规定把指数位取值为 0和255时做特殊处理,也就是当公式中E = 0 和 E = 255 时有另外的规定算方法(在下面会有说明),所以 在32位机器码转float计算时:
正值情况可以取到的最大值为 0 11111110 11111111111111111111111
正值情况可以取到的最小值为 0 00000001 00000000000000000000000
负值情况可以取到的最大值为 1 00000001 00000000000000000000000
负值情况可以取到的最小值为 1 11111110 11111111111111111111111
上面就是float可取的最大正值和最小正值,负数的情况计算方法相同,这也是在Float类中MAX_VALUE,MIN_VALUE 的规定数值
对于阶码E为0或255的情况,IEEE754标准有特别的规定:
阶码E=0并且尾数M是0,则这个数的真值为±0(正负号和数符位有关)。
因此+0的机器码为:0 00000000 000 0000 0000 0000 0000。
-0的机器码为:1 00000000 000 0000 0000 0000 0000。
需要注意一点,浮点数不能精确表示0,而是以很小的数来近似表示0。+∞和−∞的表示
如果阶码E=255 并且尾数M全是0,则这个数的真值为±∞(同样和符号位有关)。因此+∞的机器码为:0 11111111 000 0000 0000 0000 0000。-∞的机器吗为:1 11111111 000 0000 0000 0000 0000。
对应的 Float.POSITIVE_INFINITY 和 Float.NEGATIVE_INFINITYNaN(Not a Number)
如果 E = 255 并且 M 不是0,则这不是一个数(NaN)。
对应的是 Float.NaN;
下面是wiki给的IEEE754规定下单精度浮点数的一些值
双精度浮点数的最值和单精度类似,只是指数位,尾数位,偏移量都有所不同。
4、关于float和double的精度问题和浮点数运算时精度丢失问题。
在这里,我们还是以float为例来说明,double的情况和float类似。
从上面float的最值问题中我们已经知道float的在计算机中采用32位二进制的机器码来表示,并且知道她的取值范围大概是
float和double相对应的十进制有效数字分别为7位和17位
float的精度由尾数位决定,尾数位一共占23bit,对应到十进制是7~8位,所以float可以保证7位的有效数字。
关于精度的问题还是有疑问!!!!!!!!
关于精度缺失问题
首先我们要明白的,在大多数情况下float的值和它对应二进制机器码所表示的浮点数值并不相等。
这也是 2.0f - 1.9f = 0.100000024f 而不是0.1f的原因。
事实上,绝大多数的浮点数并不能准确的求出它的32位机器码,因为其小数部分表示成二进制时,很可能是超过23位,或者出现无限和无限循环的情况,但是尾数码只有23位,超过23位的都被舍去掉了,因此造成了精度缺失的情况!
那什么情况下浮点数可以被精确的储存在计算机上呢?
就是当浮点数的小数位在用二进制表示时,可以用23位尾数完全表示,而不存在舍去数值的情况下。