java虚拟机学习-02 | java的基本类型

https://time.geekbang.org/column/article/11503

boolean

  • boolean是无符号类型,在不违反规范情况下,在虚拟机中映射为整型,"true"映射为1,"false"映射为0;
  • boolean在堆中存储时,boolean占1个字节,而boolean数组是直接存在byte数组中
  • 为保证堆中boolean值合法,虚拟机将只取最后一位值存入堆中,例如通过Unsafe给boolean赋值3,二进制为11,虚拟机将只取最有边的1存入堆中
  • boolean值在加载进栈中时,将被转成int类型进行计算,这加载过程将伴随零扩展,也就是在boolean字段加载进栈时,int的低位为boolean的值,其他3个高位都以0补齐;

char

  • char为无符号类型,取值范围为[0,65535],
  • char在堆中存储时占2字节,在栈中同样以int一样4字节运算,低两位存char的值,高两位以0补齐

byte,short,int,long

  • 按顺序在分别在堆存在占1字节,2字节,4字节,8字节
  • byte,short,int在加载进栈中都与int一样占4字节,long仍然是8字节
  • byte与short当正数时,加载进栈时高位以0补齐;当负数时,高位以1补齐;

float,double

  • 在堆中分别是4字节与8字节存储
  • 在栈中同样分别为4字节与8字节存储
  • 以float为例,浮点型正常有两个0,分别是+0.0F与-0.0F;
  • +0.0F在java中是0,-0.0F是符号位1其他位是0,在内存中等同于十六进制0x8000000(即-0.0F可以通过Float.intBitToFloat(0x8000000))
  • 虽然在内存中表示不同,但+0.0F==-0.0F为真
  • 正无穷为当任意正浮点数(不包括+0.0F)除以+0.0F的值,负无穷是任意负浮点数(不包括-0.0F)除以-0.0F的值;在java中这两个是有准确值的,分别为0x7F800000和0xFF800000;而0xFF800001表示为NaN;
  • NaN的表示范围为[0x7F800001,0x7FFFFFFF]和[0xFF800001,0xFFFFFFFF],其中+0.0F/+0.0F,在内存中表示为0x7FC00000, 这个称为标准NaN
  • NaN除了"!="始终返回true外,其他比较都返回false

为什么int和float都是占4字节,但是取值范围相差那么大?

        int类型:在内存中占4字节32bit,其中左边第一位为符号位,其余为数值位,也就是数值位最大能存2^31,所以取值范围为[-2^31,2^31-1];

        float类型:在内存中占4字节32bit,按顺序为1个符号位,8个指数位,23个尾数位,其中尾数位存的是1到2之间的值;所以float类型取值是尾数位的值乘以指数位的值,加上符号位,所以取值范围为[3.4E–38,3.4E+38]

java基本数据类型存放位置

        局部变量:

         (1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中

         (2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆类存中的

          全局变量:

       (1)当声明的是基本类型的变量其变量名及其值放在堆内存中的

       (2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中

基本类型值域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值