1.八大基本数据类型
序号 | 名称 | 字节数(byte) | 位数(bit) | 默认值 | 取值范围 |
---|---|---|---|---|---|
1 | short(短整型) | 2 | 16 | 0 | -215~215-1 |
2 | int(整型) | 4 | 32 | 0 | -231~231-1 |
3 | long(长整型) | 8 | 64 | 0 | -263~263-1 |
4 | float(单精度) | 4 | 32 | 0.0 | -231~231-1 |
5 | double(双精度) | 8 | 64 | 0.0 | -263~263-1 |
6 | char(字符) | 2 | 16 | 空 | 0~216-1 |
7 | byte(长整型) | 1 | 8 | 0 | -27~27-1 |
8 | boolean(布尔型) | 1 | 8 | false | ture、false |
注意:
- 不带后缀的整数默认为 int,不带后缀的小数默认为 double
- 超出 int 取值范围的整数必须添加后缀 L或者l,表示 long 类型。建议使用L,因为l容易与数字 1 混淆
- 带有F或f后缀的数都属于 float 类型,带有D或d后缀的数都视为 double 类型
- 编译器会在编译期检查八种基本类型的取值范围,如果超出了范围会报错
- int 值可以赋值给所有数值类型;
- long 值可以赋值给 long、float、double类型,为什么 long 值占 8 个字节可以赋值给只占 4 个字节的 float 呢?这是因为赋值时会自动舍弃精度并转换为科学计数法。如:Long.MAX_VALUE: 9223372036854775807,赋值给 float,变为:9.223372E18
- float 值可以赋值给 float、double 类型
- double 值只能赋值给 double 类型
- 浮点数并不适合用于精确计算,而适合进行科学计算。在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。使用BigDecimal并且一定要用String来够造。
2. 计算机中存储数据的原理
-
原码
int型数据在计算机中以二进制存储,一个int型数据占4个字节,一个字节占8位,一共32位。
(1)第一位是标志位,标志位为0表示正数,标志位为1表示负数。
(2)剩余的31位是用来表示数字部分的 -
补码
在计算机中,数字以补码存储。正数的补码是其本身,负数的补码是除标志位外,其他位按位取反再加一。 -
补码的特性
1、一个负整数(或原码)与其补数(或补码)相加,和为模。
2、对一个整数的补码再求补码,等于该整数自身。
3、补码的正零与负零表示方法相同。
3.为什么int型数据取值范围是[-231~231-1]
计算机存储数字时,第一位是标志位,只有31位用来存储数字的值。所以最大表示的正数为0111 1111 1111 1111 1111 1111 1111 1111,即:-231-1
对于负数,当存储数字的31位均为1时,值为231-1,加上标志位1,此时的负数原码为:
1111 1111 1111 1111 1111 1111 1111 1111
对应的补码为:
1000 0000 0000 0000 0000 0000 0000 0001
用类似的表示方法可以表示出[ -231-1,~231-1]中的数,但是如果这么计算的话,1000 0000 0000 0000 0000 0000 0000 0000 这个数字就被浪费了。对于计算机宝贵的内存,浪费是绝对不允许的,所以1000 0000 0000 0000 0000 0000 0000 0000这个数字就被规定为表示 -231
。所以int型数据取值范围是[-231~231-1]