一、java基本数据类型所占的储存空间大小以,默认值以及其他
基本数据类型 | 储存空间大小 | 默认值 | 封装类 | 取值范围 |
byte | 1字节(8位 ) | 0 | Byte | -128~127 |
short | 2字节(16位 ) | 0 | Short | -32768~32767 |
int | 4字节(32位 ) | 0 | Integer | -2147483648~2147483647 |
long | 8字节(64位 ) | 0L | Long |
-9223372036854775808~9223372036854775807
|
float | 4字节(32位 ) | 0.0f | Float | 1.4E-45~3.4028235E38 |
double | 8字节(64位 ) | 0.0d | Double | 4.9E-324~1.7976931348623157E308 |
boolean | 1或4字节 | flase | Boolean | true或false |
char | 2字节16位 ) | '\u0000'(null) | Character | 0~65535 |
解释一些上表细小的点:
1.java的几个基本原则之一就是前闭后开这就是为什么整型范围的最大负数的绝对值比最大正数的原因之一(之一!!!具体的等
以后开一篇专门关于二进制的再写)
2.float和int所占储存空间的大小都为32字节但是float的取值范围却比int类型大这么多的原因是:
int类型的底层二进制除了第一位表示符号位以外其他位按照二进制计算就可以得出他的大小
而float类型不一样他的32为分为符号位、指数位、尾数为,分别占1、8、23位他的大小主要看指数部分由于指数部分也有符
号位所以指数部分的取值范围为-2的7次方2的7次方为128所以 float的最取值范围在-2的128次方到2的128次方左右
3.char字符串默认值的打印问题,用eclipse打印出来看到的东西为'口'这样一个方框造成这样的原因是因为一些系统中这种控
字符是不可见的,不可见的控制字符会打印出这种方框,不信你可以试一下eclipse中'\u0001'~'\u00020'打印的都是这种方框
4.true和false,我发现一些周围的朋友还有网上看有些人发的,他们认为boolean类型只占一个字节或者1位因为他们认为01
就可以表示true和false但实际上不是这样的,boolean类型在单独定义的时候占4个字节,在数组中占1个字节,这是jvm的
问题,目前还没研究透彻就不深究了,随便看看就好,请以权威方面的书籍或者官方文档为准
二、运算时的类型转换:自动类型转换、强制类型转换、隐式类型转换以及表达式的自动提升
首先我们需要知道的是:
1.类型转换时遵循两个原则:1)浮点型优先于其他类型.2)储存空间大的类型优先于储存空间小的类型
即double>float>long>int>short&char>byte
2.boolean类型不参与其他基本数据类型的运算其他基本数据类型则都遵循以下规则
自动类型转换:
当我们定义了一个byte变量如,byte b=1如果我们需要将这个变量赋值给其他比它优先级高的类型如short s=b这时候我
们不需要做任何处理虚拟机内部会自动帮助我们完成转换,这就叫自动类型转换,这就相当于当我们把一个小的水杯里的水
倒进大的杯子里的时候你不会觉得有任何的不正常。
强制类型转换:
当我们需要把一个优先级高的变量赋值给优先级低的变量时,如将int类型变量 i 赋值给short s 类型时,需要进行强制类型转
换要不编译时会报错,这就好像当你把一个大的水杯里的水倒进一个小杯子时会感觉别扭,如果水的量大于小杯子的容量
还会使水溢出,如果你想这么做小水杯心里肯定是不愿意的,而你一定要这么做的话就需要强制让他听话,所以short s=i这
种写法是错误的,正确的写法应该是 short s=(short)i
隐式类型转换:
在java中我们直接写的常量整型默认是int类型,而小数则是double类型,当定义一个float类型变量时如float f=1.0f 在数值
的末尾必须加上一个f,或者float f=(float)1.0但是当我们声明一个char,byte,short类型的变量如byte b=1时却不需要
添加任何东西,有些人可能会疑惑这里为什么不用强制类型转换,这就是java中的隐式类型转换,它在编译时会偷偷的将默认
的int类型转为你声明的基本数据类型。
表达式的自动提升:
在表达式运算的时候会自动提升他的数据类型为表达式中的最高优先级,例如定义一个short s=1,当计算s=s+1时会报错
因为1默认是int类型所以(s+1)中的s会先被转为int类型再进行运算,最后得到的结果是int类型,然而变量s还是short类型,
所以在这里需要进行强制类型转换s=(short)(s+1),这是一道非常经典的面试题,当然你也可以选择定义一个int类型变量来
接收 它如int i=s+1。其他的类型运算基本相似,当一个表达式中存在多个不同类型的数据时,最终得到的运算结果类型为
优先级最高的基本数据类型。在这里还特别需要注意的一个点:当我们运算char类型与整型时如char c='4'求int i=c+4这时
候先将 c转换为ASC码,字符4对应的ASC码为52所以运算的结果应该为56,而当int类型转为char类型char的值为int Asc码
对应的值