java之二进制与数据类型(二)

一、各数据类型的最大值和最小值

整数:

以byte为例,我们知道,byte共有8个bit位,最大值是0111111,最小值是10000000,用十进制来表示就是-128~127,即-2^7~2^7。

依照上面的推理方式可知

总结下表:

数据类型 bit位 取值范围
byte 8 -2^7~2^7-1
short 16 -2^15~2^15-1
int 32 -2^32~2^32-1
long 64 -2^63~2^63-1

小数:

我们知道float是32位,double为64位,分别被叫做单精度和双精度小数。但是他们的最大值却不是通过上面的代码来确定的,我们用代码来看看它们的最大值是多少:

System.out.println("float的最大值:"+Float.MAX_VALUE);
System.out.println("double的最大值:"+Double.MAX_VALUE);

运行结果:

float的最大值:3.4028235E38
double的最大值:1.7976931348623157E308

通过上面的代码,我们知道了float的最大值为3.4*10^38,double的最大值为1.79*10^308。

那为什么同样是32位的int和64位的long无法表示呢?

我们来看看存储结构:

由于二进制比较麻烦,我们用十进制来表示。

整数的存储很简单,第一位为符号位,其他剩余位都表示数值,例如

0 9 9 9

第一位为符号位,后面的三位则均为数字位,所以,这表示的就是999。

但是小数的存储方法就不相同:

符号位 指数位(阶码位) 尾数位(小数位)

以double第一位和整数一样是符号位,之后的指数位共有11位,剩下的位数全部是尾数位,以double为例,double的尾数位就是52位。

还是刚才的数值:

0 9 9 9

第一位0位符号位,第一个“9”表示指数位,后面的两个9就表示小数即0.99,那么这个数字就是0.99*10^9。

这就是为什么同样位数的小数要比整数表示的数字要大。

二、精确度

我们首先用int 和float表示相同的一个数字:

int a = 12345678;
float b = 12345678;
System.out.println("int:"+a);
System.out.println("float:"+b);

运行结果:

int:12345678
float:1.2345678E7

此时,int和float的值结果是相同的,当他们表示一个更大的数时就会出现如下问题:

int a = 123456789;
float b = 123456789;
System.out.println("int:"+a);
System.out.println("float:"+b);

运行结果:

int:123456789
float:1.23456792E8

此时,float丢失了一个数字8,现在我们再用double来表示这个数字:

double c = 123456789;
System.out.println("double:"+c);

运行结果:

double:1.23456789E8

我们惊奇的发现:double没有丢失数据!

正如我们上面说的,float是32位,double为64位,float之所以出现丢失数据的显现,是因为float的位数不足以存储123456789,所以部分数据就丢失了,但是double有64位,小数位足以表示123456789,因此就不会发生数据丢失。

三、强制数据类型转换

高精度->低精度

从高精度转为低精度时会发生精度丢失的状况,例如:

double a = 123.45;
int b = (int) a;
System.out.println(b);

运行结果:

123

可见,由double转为int时,会将小数部分丢掉。

高位->低位

位数多的转为位数少的会发生高位数据丢失,例如:

int a = 129;
byte b = (byte) a;
System.out.println(b);

运行结果:

-127

我们知道,int为32位,129用二进制表示就是00000000 00000000 00000000 10000001。在强转为byte时,由于byte只有8位,会将前24位全部舍掉,剩下的就是10000001,转为十进制就是-127。

原文地址:http://blog.51cto.com/13593129/2068182

时间: 2024-11-22 16:30:19

java之二进制与数据类型(二)的相关文章

JAVA中分为基本数据类型及引用数据类型

一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0 int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0 long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数

JAVA编程思想(2) - 操作符(二)

5. 直接常量 -一般来说,如果程序里使用了"直接常量",编译器可以准确的知道要生成什么样的类型,但有时候却是模棱两可的.这时候需要我们对编译器进行适当的"指导" -直接常量后面的后缀字符标示了它的类型. -指数记数法:e代表"10的幂次" -注意如果编译器能够正确的识别类型,就不必在数值后附加字符,例如语句: float f4 = 200; 不存在含糊不清的地方,所以200后面不需要加L,但是对于:float f4 = 1e-43f; 编译器通

JAVA中分为基本数据类型及引用数据类型(问题:堆和栈的区别,系统根据什么区分堆栈内存)

一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0 int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0 long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数

Java中的基本数据类型和引用类型

一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0 int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0 long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数

Java从零开始学四(数据类型)

一.Java数据类型划分 二.基本数据类型 No. 数据类型 大小/位 可表示的数据范围 1 long(长整数) 64 -9223372036854775808 ~ 9223372036854775807 2 int(整数) 32 -2147483648 ~ 2147483647 3 short(短整数) 16 -32768~32767 4 byte(位) 8 -128 ~ 127 5 char(字符) 2 0 ~ 255 6 float(单精度) 32 -3.4E38(-3.4´1038) ~

java中的基本数据类型一定存储在栈中吗?

首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的. 下面让我们一起来分析一下原因: 基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型在内存中的存储问题来解释一下: 一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因 在方法中生明的变量可以是基本类型的

java 基础笔记 基本数据类型对象包装类

基本数据类型对象包装类: 为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作. 用于描述该对象的类就称为基本数据类型对象包装类. 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char   Character boolean Boolean 该包装对象主要用于基本类型和字符串之间的转换. 基本类型-->字符串 1.基本类型数据+"&quo

JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Fiald,Method,反射Main方法,数组的反射和实践

JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Fiald,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识Class类 想要反射,你就必须要了解一个类--Class,我们知道,java程序中的各个java类都属于同一事物,我们通常用Classliability描述对吧,反射这个概念从JDK1.2就出来了,历史算是比较悠久了,这个Class可不是关键字哦,这个是一个类,他代表的是一类事物: 我们归根结底就

JAVA中分为基本数据类型和引用数据类型区别

一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0 int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0 long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数