一、java中的基本类型
java中一共有9中基本类型:
| 类型名称 | 默认值 | 大小 | 最小值 | 最大值 | 包装类 | 缓存区间 |
|---|---|---|---|---|---|---|
| boolean | false | 1B | 0(false) | 1(true) | Boolean | 无 |
| byte | (byte)0 | 1B | -128 | 127 | Byte | -128~127 |
| char | '\u0000' | 2B | '\u0000' | '\uFFFF' | Character | (char)0~(char)127 |
| short | (short)0 | 2B | Short | -128~127 | ||
| int | 0 | 4B | Integer | -128~127 | ||
| long | 0L | 8B | Long | -128~127 | ||
| float | 0.0F | 4B | 1.4e-45 | 3.4e+38 | Float | 无 |
| double | 0.0D | 8B | 4.9e-324 | 1.798e+308 | Double | 无 |
| refObj | 4B |
以上基本类型的默认值都是各种不同形式的0,需要注意的是:
▲在java中没有针对boolean对象的专门字节码表示,boolean = false表示的就是ICONST_0,也就是常数0赋值,但是在java中boolean b = 0编译不会通过!
▲char变量的默认值是'\u0000',\u表示的是unicode码,'\u0000'表示NUL(注意不是null),在码表中的第一个,是一个空的不可见字符,其码值为0。
▲缓存区间表示的是某些基本类型的包装类已经缓存了部分的数值,当我们新建某种类型的包装类时,会先检查下该包装类的值是否在区间中,如果在就复用已有对象,没有就新建一个!
另外还有一种基本类型refobj表示对其他类对象的应用,这里暂不讨论!
以上内容来自《码出高效,java开发手册》
二、byte、short、int、long
java的整型基本变量都是用补码形式存在于计算机中的。最高位表示的是符号位,后面的表示数值部分!结合代码实例:
System.out.println(Integer.toBinaryString(9));// 1001
System.out.println(Integer.toBinaryString(-9));// 11111111111111111111111111110111
正数:
9对应的二进制是1001,从上述表格中可以知道一共整型大小为4B,一共32位二进制位,且为正数,所以高位补0,而且对于正数原码=补码=反码,然后显示出来高位的0自动省略,所以显示是1001,而对应的存储在计算机中的二进制其实是
0000 0000 0000 0000 0000 1001。
负数:
负数的原码求补码的方式是:
所以-9的补码就是10111,然后高位补1(因为是负数)所以显示的是
1111 1111 1111 1111 1111 1111 1111 0111
Q&A
- 以byte为例,为什么byte基本类型是 128~127即
~
?
答:对于数字0,+0和-0的补码分别是0,0000000和1,0000000。在java中,我们没必要用两个补码表示一个数字,而-128的补码也是1,0000000(没有原码和反码),所以可以定义1,0000000表示-128,这样既可不用两个补码表示一个数,还能增大byte的范围(具体转换过程略!)(其他整形基本变量同理!)
- 为什么要有补码、反码和移码?
答:
原码、反码、补码的产生、应用以及优缺点有哪些? - DADAman的回答 - 知乎
三、float、double
在java中,浮点数的表示都依据 IEEE 754 标准,该标准为 32 位浮点和 64 位双精度浮点二进制小数定义了二进制标准。其存储形式为科学计数法形式,不能保证数据的精确性,所以当我们想要进行准确的计算时可以用BigDecimal类对象。
float和double的计算机存储形式如下图所示:
来自https://blog.csdn.net/zq602316498/article/details/41148063
符号位表示的是这个浮点数的正负号,为0则为正,为1则为负。
指数部分包含指第一位的数符和后面的数值部分,其也叫作阶数和其符号也可叫阶符。
尾数部分的要求:因为基数为2 ,所以IEEE要求尾数部分的小数第一个二进制位一定为1。因为这个条件一定,所以我们可以把第一位的1给隐含掉,这样就能又多一位表示尾数部分,增大了该浮点类型的表示范围!
我们用例题加以理解:
1.将写成二进制定点数、浮点数及在定点机和浮点机中的及其数形式。(其中指数部分为5位,数符1位,数值部分10位)
解:设x =
二进制表现形式为:x=0.0010011
定点表示: x=0.001001100(数值部分10位,补齐0)
浮点格式化形式: x=
定点机中表示为: =
=
=0.00 1001100(同上)
浮点机中表示为:
- = 0 1,0010 0011000000
- = 0 1,1110 0011000000
- = 0 1,1101 0011000000
上述:
第一个0为符号位,因为x为正数,所以此为0;
第二个字段表示的是指数部分,第一位自然为符号位1,后面跟着指数数值部分,因为是负数,所以原码反码部分都不一样。
第三个字段为数值字段,根据前面所说第一位1隐含起来,然后后面补0补齐10位即可。即0011000000。
Q&A
- float的取值范围如何计算?
![]()
先不讨论float的取值范围,我们先假设一个浮点数类型位数部分为n位,指数部分为m位。所以:
最大正数:应该尾数全为1(),指数为正数且也全为1(
)即
。
最小正数:应该尾数为0.100...(既要符合规范又要最小,只能这样)指数部分为负数且为全1,这样方可保证后面的2的次方最小即(),所以最小正数为:
。
最大负数:尾数应该为0.100...,然后指数应该尽可能地小同最小正数,所以最大负数为。
最小负数:尾数应同最大正数,但为负数,指数同最大正数,所以最小负数为:。
现在我们回到float的取值范围的计算,前面我们讲了,float的指数位数为8位(包含指数数符),尾数位数为23位(不包含数符),所以代入公式,取值范围为(注意这里的尾数计算按24位计算,因为第一个1是隐含的!):
~
和
~
就不做进一步计算了!
- float和double的精度如何计算?
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,由于最左为1的一位省略了,这意味着最多能表示8位数: 2*8388608 = 16777216 。有8位有效数字,但绝对能保证的为7位,也即float的精度为7~8位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为16~17位。
四、char、boolean
等我先研究研究
参考:https://blog.csdn.net/zq602316498/article/details/41148063














网友评论