Java基本数据类型
1.基本数据类型所占字节数
基本数据类型 | 字节数 |
---|---|
byte | 1 |
char | 2 |
short | 2 |
int | 4 |
long | 8 |
float | 4 |
double | 8 |
boolean | 不确定 |
2.float,double在内存空间中的存储格式
浮点数的存储格式遵循IEEE_754 标准,一个浮点数由两部分组成,底数m和指数e。float为单精度,double为双精度。
2.1 float的存储格式
-
格式:
SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF
S表示浮点数正负,0表述正数,1表示负数;
E表示指数,占用8bit(1个字节)的二进制数(数值范围为0-255),由于指数可正可负,所以IEEE_754规定此处算出的次方必须减去127才是真正的指数(偏移值为2^(e-1)-1,也就是2^7-1=127),所以,float类型的指数可从-126到128;
F表示底数,使用二进制数表示浮点数的实际值,是占用24bit(3个字节)的值,但是最高位始终为1,所以最高位省去,存储中占23bit。
-
举例(13.3):
-
转换为二进制数,整数部分模2取余法 ,小数部分乘2取整法 (取整之后余数为零则结束,否则计算到需求的精度为止,也就是说整数部分+小数部分的二进制数为24位)。
1101.0100 11001100 11001100
-
将二进制数右移,直到小数点前只剩1位
1.1010100 11001100 11001100 * 2^3 右移了3位
-
计算出指数和底数
指数:因为右移了3位,所以为3+127,二进制数为10000010;
底数:移动小数点之后,所有的小数点部分,即1010100 11001100 11001100
-
所以13.3在内存中的存储格式为:
01000001 01010100 11001100 11001100
-
2.2 double的存储格式
double为双精度格式,8字节64位,1位符号S,11位指数E,52位底数F。指数部分为-1022到1023,偏移值为2^10-1=1023。
3.boolean类型的大小
《Java虚拟机规范》中:“在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。
所以,boolean有可能为1个字节,也可能是4个字节
- 声明一个基本类型的变量时,编译后当成int处理,为4个字节;
- 声明数组类型时,数组中的每个元素占1个字节。