众所周知,Java语言内置基本数据类型共分为4类8项,分别为:
- 整型 byte/short/int/long
- 浮点型 float/double
- 布尔型 boolean
- 字符型 char
之所以分这么多种类的原因,不外乎一个很简单的道理,一个萝卜一个坑。倘若我们声明了一个long类型的变量,而只给它赋值:123。那无异于为了1个人住了一套别墅。对于空间的利用存在着极大的浪费。而再比如声明了boolean类型,却还是要给其赋值:123,那就无异于问别人吃了没,而他回答你:今天天气很好。
故Java这种分类方式首先是考虑了类型匹配,再次是考虑了对于需要开辟的空间大小的合理利用。
下面通过具体表格的形式分别介绍对应的空间大小及所表示的值范围。
类型 | 名称 | 占用存储空间 | 表数范围 |
---|---|---|---|
byte | 字节类型 | 1字节 | -128 — 127 |
short | 短整型 | 2字节 | -32768 — 32767 |
int | 整型 | 4字节 | -2147483648 — 2147483647 |
long | 长整型 | 8字节 | -9223372036854775808 — 9223372036854775807 |
float | 单精度 | 4字节 | -3.403E38 — 3.403E38 |
double | 双精度 | 8字节 | -1.798E308 — 1.798E308 |
char | 字符型 | 2字节 | 0 – 65535 |
boolean | 布尔型 | 1位 | true/false |
上表中值得注意的是:
1、存储空间大小,1字节(byte)=8位(bits)。
2、以byte示例,为何表数范围如表所示。因Java中首位为符号位(0为正,1为负),故只有另七位可自由排列组合。那么正数最大即为01111111,转换为10进制就是127。负数最小理论上是11111111,但因为计算机内存储数字是通过补码的形式(有关原码、补码、反码等请大家自行百度),及对11111111进行取反+1可得到1,0000,0000转换为10进制即为128,所以最小数为-128。
3、float/double中E即底为10,E38即为10^38。
4、char大小为64位,原因为: Java采用unicode编码,为64位。即所有字符(包括键盘上符号、字母,中文,日文,韩文 等等)都在这64位=65536个范围之内。例如使用char a=’\u4e70’(\u表示使用unicode编码,4e70为16进制),a即为”买”字。
另补充几点有关转型
1、 不能对boolean类型进行类型转换。
2、不能把对象类型转换成不相关类的对象。
3、在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
float a = (float)1.23;
4、 转换过程中可能导致溢出或损失精度,例如:
int i =128;
byte b = (byte)i;
因为byte类型时8位,最大值为127,所以当强制转换为int类型值128时候就会导致溢出。
5、 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
(int)23.7 == 23;
(int)-45.89f == -45
6、int 之下(byte short)的整型相加减等,都是先转换为int。
byte a = 1;
byte b = 2;
byte c = a + b;
这样会报错。因为a + b已经为int类型。故需要强转。byte c = (byte) (a + b);
时间不早了,以后想到或用到补充。– end