一、Java中的基本数据类型
平日里开发过程中,总是会遇到基本数据类型在内存中占几个字节的类似疑问,一直想把这些基础的知识整理一下,总是偷懒,于是今天便总结了一下,如果下面的文章哪里有问题,欢迎在评论中留言指出:
Java中有8种基本数据类型,分别是byte,short,int,long,char,float,double,boolean型数据,其在内存中占据字节数,取值范围如图:
类型 | 存储需求 | bit位数 | 取值范围 |
---|---|---|---|
byte | 1个字节 | 1*8 | -128~127(-2的7次方到2的7次方-1) |
short | 2个字节 | 2*8 | -32768~32767(-2的15次方到2的15次方-1) |
int | 4个字节 | 4*8 | -2的31次方到2的31次方-1 |
long | 8个字节 | 8*8 | -2的63次方到2的63次方-1 |
char | 2个字节 | 2*8 | 0~65535(Character.MIN_VALUE~Character.MAX_VALUE) |
float | 4个字节 | 4*8 | Float.MIN_VALUE~Float.MAX_VALUE |
double | 8个字节 | 8*8 | Double.MIN_VALUE~Double.MAX_VALUE |
boolean | 1个字节 | 1*8 | false或者true |
这里针对char、float与double类型的取值范围还要补充一下:
①Character.MIN_VALUE = ’ \u0000’; Character.MAX_VALUE = ‘\uFFFF’;而在Java中\u开头的是一个Unicode码的字符,Unicode字符通常用十六进制编码方案表示,范围在’\u0000’到’\uFFFF’之间。\u0000代表的应该是NULL,输出控制台是一个空格。而具体关于Java中Unicode的理解请参考Java中Unicode的编码和实现
②Float.MIN_VALUE = 1.4E-45(2^(-149));
Float.MAX_VALUE = 3.4028235E38((2-2^(-23))*2^127 );数值后面一般有一个F或者f,比如3.1435f
Double.MIN_VALUE = 4.9E-324;
Double.MAX_VALUE = 1.7976931348623157E308;数值后面什么都不标,默认是double类型的;
具体解释请参阅Java中float/double取值范围与精度
关于java中浮点数据的研究,请参阅基础野:细说浮点数
二、Java中的原码&反码&原码
计算机中的数据都是以二进制流的方式来存储,整数的表达:
原码:第一位为符号位(0为正数,1为负数)
反码:符号位不动,原码取反。
负数补码:符号位不动,反码加一。
正数补码:和原码相同。
比如我们用byte类型的5、-1、-6、0来举例:
5的原码:00000101
5的反码:01111010
5的补码:00000101
负数的表示:
-1的原码:10000001 -6的原码:10000110
-1的反码:11111110 -6的反码:11111001
-1的补码:11111111 -6的补码:11111010
0的表示:
0的原码:00000000 负数0的原码:10000000
0的反码:01111111 负数0的反码:11111111
0的补码:00000000 负数0的补码:00000000
在计算机系统中,数值一律用补码来表示和存储。原因如下:
同时补码的特性:
三、Java中的左移、右移、无符号右移
比如3<<2,byte类型的数字3转化为二进制,0000-0011,向左移两位,最右边两位用0补齐,其结果为12;相当于3*2^2,就是乘以2的移动的位数次幂。
3<<2移动之前: 0000-0011
3<<2移动过程:0000-001100,后面的两位补0
3<<2移动之后: 0000-1100
例:6>>2,byte类型的数字6转化为二进制00000110,向右移动两位,最左边空出的两位,用0补齐,结果为1,相当于6/4,只取整数,舍弃小数;就是除以2的移动的位数次幂。
6>>2移动之前:0000-0110
6>>2移动过程:0000-000110
6>>2移动之后:0000-0001
例:-6>>2,byte类型的数字-6转化为二进制10000110,向右移动两位,最左边空出的两位,用1补齐,结果为-2;这里注意,负数在右移的过程中,首先要转化为补码
-6>>2移动之前:1000-0110,求其补码:11111010
-6>>2移动过程: 1111-111010
-6>>2移动之后:1111-1110,负数的补码求原码1000-0010
例:-6>>>2,因为6>>>2移位的过程与6>>2相似,这里不再做过多描述,byte类型的数字-6转化为二进制10000110,当-6无符号向右移动两位,首先转化为其补码,最左边空出的两位,用0补齐;然后在转化为原码,其结果为00111110;
-6>>>2移动之前:1000-0110,求其补码:11111010
-6>>>2移动过程: 0011-111010
-6>>>2移动之后:0011-1110,其为正数,即为原码