两大数据类型
基本数据类型:byte、short、int、long、float、double、char、boolean
引用数据类型:对象、数组等,另外为符合面向对象特征,Java中每一种基本数据类型都有对应的包装类:Byte、Short、Integer、Long、Float、Double、Character、Boolean
,并且提供自动拆装箱功能。
基本数据类型
byte
位长度:8
零值:0
描述:取值范围为-128~127(-2^7 ~ 2^7-1)
char
位长度:16
;两个字节
零值:''
描述:用于描述单个任意字符(包括部分中文)、数字(0~65535);char可以执行数学运算,字符在运算过程中会转换为ASCII表中对应的整数;关于char为什么可以存中文字符:Java使用unicode编码存储字符,一个字符占两字节,一个中文字符也占两个字节。
short
位长度:16
;两个字节
零值:0
描述:短整型,取值范围-32768~32767
int
位长度:32
;四个字节
零值:0
描述:整型,Java中整型缺省类型,字面量类型;取值范围-2^31~2^31-1
,最大值约为21亿多
float
位长度:32
;四个字节
零值:0.0F
描述:单精度浮点型,实际运算中可能会有精度问题;浮点型数据存储内存结构为:V=(-1)^s * M * 2^E,第31位为实数符号位;s(30位)占一位表示指数符号位;23~29位表示指数位E;0~22位表示有效数位,算上前面的实数符号位总共24位
,也就是说float是以指数型:2.19999993E17
表示数值,真实数据范围远远不止整型的32位,这也是为什么64位的long可以自动类型转换位只占32位的float
long
位长度:64
;8个字节
零值:0L
描述:长整型
double
位长度:64
;8字节
零值:0.0D
描述:双精度浮点型,实际运算可能会有精度问题,如金额运算,需要使用BigDecimal
boolean
位长度:8或32位
;1字节或4字节
零值(初始值):false
描述:只有两种值,true/false表示真/假;在《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。也就是说JVM规范指出boolean当做int处理,也就是4字节,boolean数组当做byte数组处理,这样我们可以得出boolean类型占了单独使用是4个字节,在数组中是确定的1个字节。
如果以数字表示,0为false,非0为true。
在js中还有如下规则:
if (‘0’) alert("‘0’ is true");
if (‘0’ == false) alert("‘0’ is false");
结果是,两次都 alert 了!那么 ‘0’ 到底是 true 还是 false 呢?
在js做比较的时候,有这样的三条规则:
- 如果比较的两者中有boolean,会把 boolean 先转换为对应的 number,即 0 和 1(false是0,1是true)
- 如果比较的双方中有一方为number一方为string,会把string转换为数字
- 把string直接转换为boolean的时候,空字符串‘’转换为 false,除此外的一切字符串转换为 true
类型转换
正向过程:自动类型转换,占位小的类型可以自动转换为占位大的类型,如:byte、char>short>int>long>float>double
逆向过程:强制类型转换,可能会造成高位精度丢失
类型提升
运算过程会出现类型自动提升现象,规则如下:
如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。
否则,如果其中一个操作数是float类型,另一个将会转换为float类型。
否则,如果其中一个操作数是long类型,另一个会转换为long类型。
否则,两个操作数都转换为int类型。
原码、反码与补码
计算机中数据是以补码的形式存储数字
原码:数字的二进制表示,最高位用于符号位,0为正,1为负
反码:正数的反码等于原码,负数的反码等于原码符号位不变其余各位取反
补码:正数的补码等于原码,负数的补码等于反码+1
反码是为了解决正负相加等于0而引入的,但是无法区分+0与-0;补码使用进位溢出解决了+/-0问题,但是引入了如【-128~127】中的-128.
如上图:-8是怎么来的?
用4位2进制表示:(-1)+(-7)= 【1111】_补+【1001】_补 = 【1000】补 = (-8)。-8只有补码,没有原码和反码,也是4位带符号的2进制可以表示的最小数字。