美文网首页
java----从计算机存储形式分析java中基本类型

java----从计算机存储形式分析java中基本类型

作者: 不过意局bugyj | 来源:发表于2019-01-03 23:34 被阅读0次

一、java中的基本类型

java中一共有9中基本类型:

类型名称 默认值 大小 最小值 最大值 包装类 缓存区间
boolean false 1B 0(false) 1(true) Boolean
byte (byte)0 1B -128 127 Byte -128~127
char '\u0000' 2B '\u0000' '\uFFFF' Character (char)0~(char)127
short (short)0 2B -2^{15} -2^{15}-1 Short -128~127
int 0 4B -2^{16} 2^{16}-1 Integer -128~127
long 0L 8B -2^{32} 2^{32}-1 Long -128~127
float 0.0F 4B 1.4e-45 3.4e+38 Float
double 0.0D 8B 4.9e-324 1.798e+308 Double
refObj 4B

以上基本类型的默认值都是各种不同形式的0,需要注意的是:
▲在java中没有针对boolean对象的专门字节码表示,boolean = false表示的就是ICONST_0,也就是常数0赋值,但是在java中boolean b = 0编译不会通过!
▲char变量的默认值是'\u0000',\u表示的是unicode码,'\u0000'表示NUL(注意不是null),在码表中的第一个,是一个空的不可见字符,其码值为0。
▲缓存区间表示的是某些基本类型的包装类已经缓存了部分的数值,当我们新建某种类型的包装类时,会先检查下该包装类的值是否在区间中,如果在就复用已有对象,没有就新建一个!

另外还有一种基本类型refobj表示对其他类对象的应用,这里暂不讨论!

以上内容来自《码出高效,java开发手册》

二、byte、short、int、long

java的整型基本变量都是用补码形式存在于计算机中的。最高位表示的是符号位,后面的表示数值部分!结合代码实例:

        System.out.println(Integer.toBinaryString(9));// 1001
        System.out.println(Integer.toBinaryString(-9));// 11111111111111111111111111110111

正数:
9对应的二进制是1001,从上述表格中可以知道一共整型大小为4B,一共32位二进制位,且为正数,所以高位补0,而且对于正数原码=补码=反码,然后显示出来高位的0自动省略,所以显示是1001,而对应的存储在计算机中的二进制其实是
0000 0000 0000 0000 0000 1001。

负数:
负数的原码求补码的方式是:
y=\begin{cases} x\quad 2^n>x\geq 0 \\\\ 2^{n+1}+x\quad 0>x>-2^n \end{cases}
所以-9的补码就是10111,然后高位补1(因为是负数)所以显示的是
1111 1111 1111 1111 1111 1111 1111 0111

Q&A

  1. 以byte为例,为什么byte基本类型是 128~127即-2^7 ~ 2^7-1
    答:对于数字0,+0和-0的补码分别是0,0000000和1,0000000。在java中,我们没必要用两个补码表示一个数字,而-128的补码也是1,0000000(没有原码和反码),所以可以定义1,0000000表示-128,这样既可不用两个补码表示一个数,还能增大byte的范围(具体转换过程略!)(其他整形基本变量同理!)
  1. 为什么要有补码、反码和移码?
    答:
    原码、反码、补码的产生、应用以及优缺点有哪些? - DADAman的回答 - 知乎

三、float、double

在java中,浮点数的表示都依据 IEEE 754 标准,该标准为 32 位浮点和 64 位双精度浮点二进制小数定义了二进制标准。其存储形式为科学计数法形式,不能保证数据的精确性,所以当我们想要进行准确的计算时可以用BigDecimal类对象。
float和double的计算机存储形式如下图所示:



来自https://blog.csdn.net/zq602316498/article/details/41148063

符号位表示的是这个浮点数的正负号,为0则为正,为1则为负。
指数部分包含指第一位的数符和后面的数值部分,其也叫作阶数和其符号也可叫阶符
尾数部分的要求:因为基数为2 ,所以IEEE要求尾数部分的小数第一个二进制位一定为1。因为这个条件一定,所以我们可以把第一位的1给隐含掉,这样就能又多一位表示尾数部分,增大了该浮点类型的表示范围!

我们用例题加以理解:
1.将+\frac{19}{128}写成二进制定点数、浮点数及在定点机和浮点机中的及其数形式。(其中指数部分为5位,数符1位,数值部分10位)

解:设x = +\frac{19}{128}
二进制表现形式为:x=0.0010011
定点表示: x=0.001001100(数值部分10位,补齐0)
浮点格式化形式: x=0.100110000 × 2^{-10}
定点机中表示为: [x]_{原} = [x]_{反} = [x]_{补} =0.00 1001100(同上)
浮点机中表示为:
- [x]_{原} = 0 1,0010 0011000000
- [x]_{反} = 0 1,1110 0011000000
- [x]_{补} = 0 1,1101 0011000000

上述:
第一个0为符号位,因为x为正数,所以此为0;
第二个字段表示的是指数部分,第一位自然为符号位1,后面跟着指数数值部分,因为是负数,所以原码反码部分都不一样。
第三个字段为数值字段,根据前面所说第一位1隐含起来,然后后面补0补齐10位即可。即0011000000。

Q&A

  1. float的取值范围如何计算?

    先不讨论float的取值范围,我们先假设一个浮点数类型位数部分为n位,指数部分为m位。所以:
    最大正数:应该尾数全为1(1-2^{-n}),指数为正数且也全为1(2^m-1)即(1-2^{-n})× 2^{(2^m-1)}
    最小正数:应该尾数为0.100...(既要符合规范又要最小,只能这样)指数部分为负数且为全1,这样方可保证后面的2的次方最小即(2^{-(2^m-1)}),所以最小正数为:0.1×2^{-(2^m-1)}
    最大负数:尾数应该为0.100...,然后指数应该尽可能地小同最小正数,所以最大负数为-0.1×2^{-(2^m-1)}
    最小负数:尾数应同最大正数,但为负数,指数同最大正数,所以最小负数为:-(1-2^{-n})×2^{ (2^m-1)}
    现在我们回到float的取值范围的计算,前面我们讲了,float的指数位数为8位(包含指数数符),尾数位数为23位(不包含数符),所以代入公式,取值范围为(注意这里的尾数计算按24位计算,因为第一个1是隐含的!):
    -(1-2^{-24})×2^{127}~-2^{-128}2^{-128}~(1-2^{-24})×2^{127}
    就不做进一步计算了!
  1. float和double的精度如何计算?
    float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
    float:2^23 = 8388608,一共七位,由于最左为1的一位省略了,这意味着最多能表示8位数: 2*8388608 = 16777216 。有8位有效数字,但绝对能保证的为7位,也即float的精度为7~8位有效数字;
    double:2^52 = 4503599627370496,一共16位,同理,double的精度为16~17位。

四、char、boolean

等我先研究研究

参考:https://blog.csdn.net/zq602316498/article/details/41148063

相关文章

  • java----从计算机存储形式分析java中基本类型

    一、java中的基本类型 java中一共有9中基本类型: 以上基本类型的默认值都是各种不同形式的0,需要注意的是:...

  • Java基础系列5-Java的数据类型

    一.Java的基本数据类型 1.1 计算机存储单元   变量是内存中的小容器,用来存储数据。那么计算机内存是怎么存...

  • Java数据类型-基本数据类型

    Java数据类型 类型决定了存储的形式和占用的存储空间 一、基本数据类型-四类八种 1、整型:byte 、shor...

  • java包装类

    java包装类是为了解决java基本类型在面向对象过程中的一些不足。如,java基本类型不能存储在集合类型中(如L...

  • Java基本类型

    java中数据的基本类型分为:基本数据类型和引用数据类型,对此不多介绍; 接下来讨论一下java中数据类型存储在哪...

  • Java基本类型

    java中数据的基本类型分为:基本数据类型和引用数据类型,对此不多介绍; 接下来讨论一下java中数据类型存储在哪...

  • 2.1 数据类型

    数据类型是指数据在计算机内部的表达和存储形式。根据性质和用途,数据被划分为多种不同的类型。Python基本数据类型...

  • java基础之变量与内存(1)

    该章节讨论java变量,主要分为基本(数据)类型和引用类型,以及变量在内存堆栈中的存储。 基本类型: 布尔型:bo...

  • c#类型

    C# 的数据类型分为:值类型和引用类型值类型:变量:从用户角度,变量是存储信息的基本单元。从系统角度,变量是计算机...

  • Java引用传递和值传递

    1.Java中数据类型的存储 基本类型包括:byte,short,int,long,char,float,doub...

网友评论

      本文标题:java----从计算机存储形式分析java中基本类型

      本文链接:https://www.haomeiwen.com/subject/xssqrqtx.html