基本数据类型

基本数据类型

文章目录

  • 基本数据类型
  • 前言
  • 1.类型
  • 2.存储空间、表数范围、精度
  • 3.整数型
  • 4.浮点型
    • 4.1.浮点型float底层存储原理
      • 4.1.1.十进制转二进制
      • 4.1.2.float类型位图介绍
      • 4.1.3.39.29 转换为二进制过程
  • 5.字符型
  • 6.布尔型
  • 7.基本类型转换
    • 7.1.自动类型转换
    • 7.2.强制类型转换


前言

基本数据类型共8类,byte、short、int、long、float、double、char、boolean。


1.类型

整数型:byte、short、int、long
浮点型:float、double
字符型:char
布尔型:boolean

2.存储空间、表数范围、精度

byte short int long float double char boolean
存储空间 1 2 4 8 4 8 2
表数范围 -128~127 -215 ~ 215-1 -231 ~ 231-1 -263 ~ 263-1 -3.403E38 ~ 3.403E38 -1.798E308 ~ 1.798E308 true/false
精度 7 14

注意,虽然long的长度大于float的长度,但long的表数范围并没有float的表数范围大,是因为float采用的科学计数法来存储数据的。

3.整数型

包含4种,byte、short、int、long。

  • java的整型常量默认为int型
  • java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long
  • 声明long型常量,后面须加“l”或“L”

4.浮点型

包含2种,float、double。float,单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求。double,双精度,精度是float的两倍。通常采用此类型。

  • Java 的浮点型常量默认为double型 型,明 声明float 型常量,须后加‘f’ 或‘F’ 。

浮点型通常有两种表现形式:
1.十进制数形式:如:5.12 512.0f .512 (必须有小数点)
2.科学计数法形式:如:5.12e2 512E2 100E-2

4.1.浮点型float底层存储原理

4.1.1.十进制转二进制

整数部分直接转成二进制。小数部分一直乘以2,小于1则用结果继续乘,大于1则结果减1继续乘,等于1则结束,小于1即为0,大于1即为1。

4.1.2.float类型位图介绍

基本数据类型_第1张图片

  • sign,用1位来表示浮点数正负,0表示正数;1表示负数。
  • exponent,用8位表示二进制的科学计数法中的指数部分的值,8位表示的数据范围可以是0 ~ 255,但是由于指数部分可能为负数,所以这个指数的范围为-128 ~ 127。再计算时让【指数+127】得到值转换为二进制存储在此即可。

注:0.5375的二进制小数位0.10001,科学计数法为 1.0001 * 2^-1。

  • fraction,用32为来表示二进制小数的科学计数法中的小数部分(不管整数部分,因为科学计数法中的整数总是为 1)。

4.1.3.39.29 转换为二进制过程

// 整数部分 39
100111

// 小数部分 0.29
0.29 * 2 = 0.58; // 0 小于1,则继续乘
0.58 * 2 = 1.16; // 1 大于1,则减1继续乘
0.16 * 2 = 0.32; // 0 小于1,则继续乘
0.32 * 2 = 0.64; // 0 小于1,则继续乘
0.64 * 2 = 1.28; // 1 大于1,则减1继续乘
0.28 * 2 = 0.56; // 0 小于1,则继续乘
0.56 * 2 = 1.12; // 1 大于1,则减1继续乘
0.12 * 2 = 0.24; // 0 小于1,则继续乘
0.24 * 2 = 0.48; // 0 小于1,则继续乘
0.48 * 2 = 0.96; // 0 小于1,则继续乘
0.96 * 2 = 1.92; // 1 大于1,则减1继续乘
0.92 * 2 = 1.84; // 1 大于1,则减1继续乘
0.84 * 2 = 1.68; // 1 大于1,则减1继续乘
0.68 * 2 = 1.36; // 1 大于1,则减1继续乘
0.36 * 2 = 0.72; // 0 小于1,则继续乘
0.72 * 2 = 1.44; // 1 大于1,则减1继续乘
0.44 * 2 = 0.88; // 0 小于1,则继续乘
0.88 * 2 = 1.76; // 1 大于1,则减1继续乘
0.76 * 2 = 1.52; // 1 大于1,则减1继续乘
0.52 * 2 = 1.04; // 1 大于1,则减1继续乘
0.04 * 2 = 0.08; // 0 小于1,则继续乘
0.08 * 2 = 0.16; // 0 小于1,则继续乘
0.16 * 2 = 0.32; // 0 小于1,则继续乘(与第三行相同,这样会一直循环执行下去)
。。。
将相乘之后的结果的整数部分拼接起来,所以0.29 的二进制表示:01001010001111010111000...

  • 结果:10111.01001010001111010111000…
  • 科学计数法:1.011101001010001111010111000… * 25
  • sign = 0,浮点数为正数。
  • exponent = 01000010,指数 5 + 127 = 132,将132转换为二进制。
  • fraction = 00111010010100011110101,最多保留23为二进制小数位,其他省略(不精确)。
  • 所以,最终39.25在存储时的二进制为:0 01000010 00111010010100011110101

5.字符型

只有一种,char。用来表示通常意义上“字符”(2字节)。

  • Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。
  • char类型是可以进行运算的。因为它都对应有Unicode码。例如:
// 字符'a'的Unicode码值为97
char c = 'a';
int i = c + 1;
System.out.println("i=" + i);
>>> i=98

字符型变量的三种表现形式:
1.字符常量是用单引号(‘ ’)括起来的单个字符。例如:char c1 = ‘a’; char c2= ‘中’; char c3 = ‘9’;
2.Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。例如:char c3 = ‘\n’; // '\n’表示换行符。
3.直接使用 Unicode 值来表示字符型常量:‘\uXXXX’。其中,XXXX代表一个十六进制整数。如:\u000a 表示 \n。

6.布尔型

boolean 类型用来判断逻辑条件,一般用于程序流程控制。boolean类型数据只允许取值true和false,无null。

  • 不可以使用0或非 0 的整数替代false和true,这点和C语言不同。
  • Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替:true用1表示,false用0表示。(取自《java虚拟机规范 8版》)

7.基本类型转换

基本数据类型之间的转换规则。

7.1.自动类型转换

容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为:
自动类型转换规则

  • 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
  • byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
  • boolean类型不能与其它数据类型运算。
  • 当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型。

7.2.强制类型转换

自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符:(),但可能造成精度降低或溢出,格外要注意。

  • 通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。如: String a = “43”; int i = Integer.parseInt(a);
  • boolean类型不可以转换为其它的数据类型。

你可能感兴趣的:(java基础,java,jvm,数据结构)