Java数据类型
文章目录
定义
java语言是强类型语言,对于每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间
基本数据类型
java中包含8个基本数据类型:
boolean、byte、char、short、int、float、double、long
分类
数值型
-
整数类型
- byte
- short
- int
- long
-
浮点类型
-
float
- 存储结构:32位,符号位S__指数位E_尾数位M
-
double
- 存储结构:64位,符号位S__指数位E_尾数位M
-
字符型
- char
布尔型
-
boolean
计算机存储单元
- 位(bit):二进制数中的一个数位,可以是0或者1,是计算机中数据的最小单位。二进制的一个“0”或一个“1”叫一位。
- 字节(Byte,B):计算机中数据的基本单位,每8位组成一个字节。各种信息在计算机中存储、处理至少需要一个字节。
- 常用存储单元关系
- 1B=8b
- 1KB =1024B
- 1MB=1024KB
- 1GB=1024MB
- 1TB=1024GB
基本数据类型图
类型 | 类型名称 | 关键字 | 占用内存 | 取值范围 | 默认值 |
---|---|---|---|---|---|
整型 | 字节型 | byte | 1B | -128(-27)~127(27-1) | 0 |
整型 | 短整型 | short | 2B | -32768(-215)~32767(215-1) | 0 |
整型 | 整型 | int | 4B | -231~231-1 | 0 |
整型 | 长整型 | long | 8B | -263~263-1 | 0L |
浮点型 | 单精度浮点型 | float | 4B | -3.4E38~3.4E38 | 0.0F |
浮点型 | 双精度浮点型 | double | 8B | -1.7E308~1.7E308 | 0.0D |
字符型 | 字符型 | char | 2B | 表示一个字符,如(‘a’,‘A’,‘我’) | ‘\U0000’ |
布尔型 | 布尔型 | boolean | 1B | 只有两个值,true或fales | false |
float、double的内存存储格式
float类型数字在计算机中用4个字节存储。遵循IEEE-754格式标准:
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S表示浮点数正负
E指数 加上127后的值得二进制数据
M底数
类型 | 符号位 | 指数 | 位数 | 长度 |
---|---|---|---|---|
float | 1 | 8 | 23 | 32 |
double | 1 | 11 | 52 | 64 |
示例
17.625在内存中的存储为:
首先要把17.625换算成二进制:10001.101。
整数部分:除以2,直到商为0,余数反转。(即:模2取余法)
17 % 2 = 8 —> 1 低位
8 % 2 = 4 —> 0
4 % 2 = 2 —> 0
2 % 2 = 1 —> 0
1 % 2 = 0 —> 1 高位
小数部分:乘以2,直到乘位为0,进位顺序取。(即:乘2取整法)
按如下算法进行:
1)首先给小数部分乘2,得到的数,如果小数点前为1;则计1,为0,则计0。
2)再对剩下的小数部分乘2,再计出1或0。
3)重复以上步骤,直至达到需要的精度。
0.625 x 2 = 1.25 —> 1 -1位
0.25 x 2 = 0.5 —> 0 -2位
0.5 x 2 = 1.0 —> 1 -3位
0.0 x 2 = 0.0 —> 0 -4位
…
以上得到17.625换算成二进制为10001.101。
再将10001.101右移,直到小数点前只剩1位,1.0001101 * 24 ,右移动了四位。
此时,底数和指数就出来了。
底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好。所以,此处的底数为:0001101
指数:实际为4,必须加上127(转出的时候,减去127),所以为131。也就是10000011
符号:因为是正数,所以是0
综上所述,17.625在内存中的存储格式是:01000001 10001101 00000000 00000000
数据类型转化
定义
- 数据类型的转化是在赋值的数据类型和变量声明的数据类型不一致时发生的,它需要把数据从一个数据类型转换为另一种数据类型
分类
隐式转换(自动类型转换)
-
定义
- 低级类型数据可以自动转换为高级类型数据
-
转换规则
- 数值型数据转换:byte–>short/char–>int–>long–>float–>double
-
运算时的类型转换
-
1、不同类型先转换成同一类型再计算
-
2、转换按长度从小转到大的放心进行,保证精度不丢失
-
3、 java默认整型为int,char、byte、short运算时,默认先转换成int型进行计算
-
4、java默认浮点型为double,若要定义float型浮点数需要在后面加f/F
byte b = 3; /*编译通过,虽然3默认是Int类型,但是常量直接赋值给byte时,系统内部会自动作一个判断,只要在byte范围内就可以*/ short s = 3000; /*编译通过,同上*/ long l = 4; /*编译通过,同上,但一般也成long l=4l*/ long la = 101000001010; /*编译不通过,101000001010超出int取值范围,系统不会自动将它当作double类型处理*/ long lb = 101000001010l; /*编译通过,101000001010后面加l,手动将其指定为long类型*/ float f = 2.3; /*编译不通过,因为2.3默认是double型变量,不能赋给float型变量,在范围内也不行*/ float f1 = 2.3f; /*编译通过,因为2.3f指定了2.3是float型变量*/ double d = 34.56; /*编译通过*/ b = b + 2; /*编译不通过,因为2是Int型,b也自动提升成int型进行运算,得到的结果还是int型的;因为b是变量,这时系统内部就无法判断运算结果是否在byte范围内,因此不能再赋给byte变量*/ b = (byte) (b + 2); /*编译通过,但注意不能写成b=(byte)b+2,不起作用*/ char c = '你'; /*编译通过,一个char类型变量占2个字节,一个汉字也是占2个字节*/ System.out.println('a' + 1); /*ASCII码表中有'a'与数字的对应,和1运算时,类型就会提升为int,将ASCII表中'a'对应的数字体现出来,打印98*/ System.out.println('a'); /*单独打印'a'时是显示字符效果*/
-
显示转换(强制类型转换)
- 不同类型间数据可以手动进行强制类型转换,转换语法:目标类型 变量名=(目标类型)(被转换的数据)
包装类过度类型转换
数据类型 | 封装类 |
---|---|
boolean | Boolean |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
引用数据类型
- 类
- 接口
- 数组