java数据类型一共分为四大类:boolean、整数类、浮点类、字符类。如下图:
第一类:逻辑型boolean
boolean类型数据只允许取值true或false,与c语言不同的是,它不可以用整数0或非0整数取代true和false。
关于boolean类型的变量在jvm中占多少字节,在java规范中并没有给出精确的定义。但在《Java虚拟机规范》一书中是这样描述的:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。因此,我们可以得出boolean类型单独使用是4个字节,在数组中又是1个字节。
第二类:文本型char
字符常量为用单引号括起来的单个字符,例如:
char eChar='a';
char cChar='中';
java中,char类型的采用unicode编码,每个字符占两个字节。
第三类: 整数型(byte、short、int、long)
每种整数型占用的存储空间和表示范围如下:
类型 | 存储空间 | 表示范围 |
byte | 1字节 | -128--127 |
short | 2字节 | -2^15(-32768)--2^15-1(32767) |
int | 4字节 | -2^31(-2147483648)--2^31-1(2147483647) |
long | 8字节 | -2^63--2^63-1 |
java的整型常量默认为int型,声明long类型的常量可以后加“l”或“L”,如:
int i=600;//正确
long lo=555L;//必须加L否则会出错
值得一提的是,short常量可以直接声明,例如short=3;
但是,不管声名哪种类型的常量,常量值都不超出它能表示的范围,例如:
short s1=5;//正确
short s2=32769;//错误,超出了-2^15(-32768)--2^15-1(32767)范围
int i=2147;//正确
int i=2147483649;//错误,超出了-2^31(-2147483648)--2^31-1(2147483647)范围
第四类:浮点型(float、double)
在数学中0到1有无数个浮点数;而计算机是离散的,所以表示的时候有误差,计算机用精度(小数点后几位来表示正确),比较浮点数时a==0.1是不合适的,应该a-0.1==0;如果a是0.1,则即使有误差 a-0.1==0因为a和0.1都被表示为一个有误差的计算机二进制。
每种浮点数型占用的存储空间和表示范围如下:
类型 | 存储空间 | 表示范围 |
float | 4字节 | -3.403E38--3.403E38 |
double | 8字节 | -1.798E308--1.798E308 |
java浮点型常量默认为double类型,如果要声明一个常为float型,后面加f或F,如:
double d=123.6//正确
float f=13.5f;//必须加f,否则会出错
java移位运算符:
java运算符具体有哪些,以及各自优先级,这里先不详解,而只选择比较复杂的移位运算符进行详解和总则。移动运算符包括左移运算符(<<)、右移运算符(>>)、无符号右移(>>>)三个。
计算机中用补码表示数据,所以在进行移位操作时,也是将补码按位移动。
1、左移运算符(<<)
左移运算符<<使指定值的所有位都左移规定的次数。
它的通用格式如下所示:
value << num
num 指定要移位值value 移动的位数。
左移的规则只记住一点:丢弃最高位,0补最低位
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了332=1位。
左移运算符运算规则
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
举个栗子:
数据 127,补码和原码一样:0111 1111。
左移一位:1111 1110-> 补码对应的原码为:1000 0010 对应十进制:-2
左移二位:1111 1100-> 补码对应的原码为:1000 0100 对应十进制:-4
左移三位:1111 1000-> 补码对应的原码为:1000 1000 对应十进制:-8
左移四位:1111 0000-> 补码对应的原码为:1001 0000 对应十进制:-16
左移五位:1110 0000 -> 补码对应的原码为:1010 0000 对应十进制:-32
左移六位:1100 0000 -> 补码对应的原码为:1100 0000 对应十进制:-64
左移七位:1000 0000-> 补码对应的原码为:1000 0000 对应十进制:-128
左移八位:0000 0000-> 补码对应的原码为:0000 0000 对应十进制:0
2、右移运算符(>>)
它的通用格式如下所示:
value >> num
num 指定要移位值value 移动的位数。
右移的规则只记住一点:符号位不变,左边补上符号位
运算规则:
按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1
当右移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
右移一位相当于除2,右移n位相当于除以2的n次方。
3、无符号右移运算符(>>>)
它的通用格式如下所示:
value >>> num
num 指定要移位值value 移动的位数。
无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位
无符号右移规则和右移运算是一样的,只是填充时不管左边最高位的数字是正是负,都用0来填充,无符号右移运算只针对负数计算,因为对于正数来说这种运算没有意义。
无符号右移运算符>>> 只是对32位和64位的值有意义
举例对比>>与>>>:
-5用二进制补码表示1111 1011,红色为该数符号位
-5>>2:1111 1011-------------->1111 1110,11为标志位
-5>>>2:1111 1011-------------->0011 1110,00为补充的0
上文中粗体字体或红色字体的内容为重点了解或者记忆的内容,更多信息,请用微信扫码关注本人公众号