type
status
date
slug
summary
tags
category
icon
password
Property
数据类型有什么用?
数据类型不同,程序在执行的过程中,给变量分配的空间大小也是不一样的。所以不同的数据类型为变量分配不同大小的空间。
Java总共有两种数据类型,主要有基本类型和引用类型,引用类型包括数组、类、接口。
基本数据类型是CPU可以直接进行运算的类型
基本数据类型(四大类八小种)
- 整型:byte 、short 、int 、long
- 浮点型:float 、 double
- 字符型:char
- 布尔型:boolean
boolean和char没有正负之分;数字类型都是有正负之分的,所以这些类型的数字对应的二进制位最左边的那个二进制位是符号位。
整型
Java只定义了带符号的整型,最高位的bit表示符号位(0表示正数,1表示负数)
各种整型能表示的最大范围如下:
- byte:-128 ~ 127
- short: -32768 ~ 32767
- int: -2147483648 ~ 2147483647
- long: -9223372036854775808 ~ 9223372036854775807
java中整数型字面量的几种表示形式?
- 十进制
- 八进制: 0开始
- 十六进制:0x开始
- 二进制:0b开始
同一个数的不同进制的表示是完全相同的,例如
15
=0xf
=0b1111
浮点型
浮点类型的数就是小数,因为小数用科学计数法表示的时候,小数点是可以“浮动”的,如1234.5可以表示成 ,也可以表示成 ,所以称为浮点数。
- float(单精度,精度较低,最多可以支持7位小数)4个字节,32位。
- double(双精度,精度较高,最多可以支持15位小数)8个字节,64位。
java中,浮点型字面量默认被当做
double
处理,想当做float
类型,需要在字面量后面添加F/f
浮点数可表示的范围非常大,
float
类型可最大表示 ,double
类型可最大表示 。在计算机中,存储浮点型数据都是存储的近似值。因为在小数方面有无限循环小数,而计算机的内存是有限的,用有限的资源存储无限的数据,只能存储近似值。
0.1 * 3 == 0.3
结果是false?浮点型数据在内存当中是如何存储的?3.14在内存中是怎么存的?
对于3.14来说,这个小数点“.”计算机就是无法存储的,因为计算机只能存储二进制。所以这个二进制存储的时候具有特定的规格,应该有特定的存储规范。比如:二进制位当中前多少多少位是整数,二进制当中后多少多少位是小数位。
计算机存储浮点型数据的时候遵循了一个存储规范:IEEE754标准(IEEE二进制浮点数算术标准)
以float类型为例,研究一下这个IEEE754标准:
- float类型占用32个二进制位
- IEEE754标准将32个二进制位划分成了3部分。
- 从左边的二进制位开始:
- 第1个二进制位是:符号位[S](1表示负数,0表示正数)
- 第2~9个二进制位是:指数位[E](8个二进制位)
- 第10~32个二进制位是:尾数位[M](23个二进制位)
- 由于float的特殊存储结构,导致了float虽然是4个字节,但是比8个字节的long类型容量还要大
布尔类型
布尔类型
boolean
只有true
和false
两个值,布尔类型总是关系运算的计算结果:Java语言对布尔类型的存储并没有做规定,因为理论上存储布尔类型只需要1 bit,但是通常JVM内部会把
boolean
表示为4字节整数。字符类型
字符类型
char
表示一个字符。Java的char
类型除了可表示标准的ASCII外,还可以表示一个Unicode字符:char
类型使用单引号'
,且仅有一个字符,要和双引号"
的字符串类型区分开还可以直接用转义字符
\u
+Unicode编码来表示一个字符:引用类型
除了上述基本类型的变量,剩下的都是引用类型。例如,引用类型最常用的就是
String
字符串:引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置
基本数据类型之间的转换规则
- 八种基本数据类型中,除了boolean类型之外,剩下的7种类型之间都可以进行类型转换。
- 当整数型字面值没有超出byte、short、char取值范围,那么可以直接将它赋值给byte、short、char类型的变量
- byte short char在做数学运算的时候,各自会先转换成int类型,再做运算
- 小容量可以自动转换成大容量,八种基本数据类型容量从小到大的顺序:
byte < short/char < int < long < float < double
char和short容量相同,都是2个字节,只不过char可以表示更大的正整数
- 多种数据类型做混合运算,各自先转换成容量最大的类型之后再做运算
- 大容量转换成小容量,必须添加强制类型转换符,编译才能通过,但是运行的时候可能会损失精度