字节(Byte):一个字节等于8个二进制位
1字节(Byte) = 8位(bit)
比特(Bit):亦称二进制位,指二进制中的一位,是信息的最小单位.
在Java中,一共有8中基本类型,其中4种整型、2种浮点型、1种Unicode编码的字符单元的字符型char和1种用于表示真值的boolean类型。
整型 | int | short | long | byte |
---|---|---|---|---|
占用字节数 | 4 | 2 | 8 | 1 |
取值范围 | -2 147 483 648 ~ 2 147 483 647 | -32768 ~ 32767 | -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 | -128 ~ 127 |
整型
在Java中整型的范围与运行Java代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台的不同操作系统之间进行移植给程序员带来的诸多问题。
长整型数值有一个后缀L或l,例如long l=4000000000L;
十六进制数值又一个前缀0x或0X,例如int c=0xA1;
从Java7开始,加上前缀0b或0B就可以写二进制数,例如:
int i=0b1001;
还可以在数字下面画”_”,使数字更通俗易懂。
例如 int tel=12_345_678;
浮点类型
整型 | float | double |
---|---|---|
占用字节数 | 4 | 8 |
取值范围 | 大约±3.402 823 47E+38F(有效位数为6~7位) | 大约±1.797 693 134 862 315 70E+308(有效位数为15位) |
float:后缀为F或f。
fouble:后缀为D或d。
没有后缀F的浮点数值(如3.14)默认为double类型。
char类型
char:用于表示单个字符。
char类型的值可以表示为十六进制值,其范围为\u0000-\Uffff(也称Unicode值)
A:’\u0041’
B:’\u0042’
™:’\u2122’
//file at C:\users(此时会报错,因为u后面并未跟着4个十六进制数)
boolean类型
boolean:该类型有两个值:false和true,用来判定逻辑条件,整型和布尔值之间无能进行相互转换。
数值类型间的转换
实线头:无信息丢失的转换
虚线头:表示可能有精度损失的转换
例:
int n=123456789;
float f=n;
System.out.println("f = " + f);
输出:f = 1.23456792E8
当使用不同类型进行运算时,应先转换为同一个类型。
如果两个操作数中有一个是double类型,另一个操作数就会转换成double类型。
否则,如果其中一个操作数是float类型,另一个操作数将会转换成float类型。
否则,如果其中一个操作数是long类型,另一个操作数将会转换成long类型。
否则,两个操作数都将被转换为int类型。
强制类型转换
如果将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如:
byte u= (byte) 300;
System.out.println("u = " + u);
300=100101100
因为byte是1个字节,8个bit。
所以结果等于00101100(把第一位去掉了)=44
byte b = (byte)130;
System.out.println(b);
1. 将130转换成为二进制为:00000000 00000000 00000000 10000010
2. 因为130是int型,在Java中占用了4个字节,而byte在Java中占用1个字节,将int转换成为byte,就将前三个字节截取掉,变成了:10000010
3. 因为10000010是补码,转换成源码为符号位不变,其他按位取反,最后+1
4. 11111101(反码)+1=11111110(补码)=-126
左移、右移、无符号右移
注意:这里都拿负数举例。
int value=-8;
因为int是占4个字节,1个字节等于8个二进制数
源码:1_(27个0)1000
反码:1_(27个1)01 1 1
补码:1_(27个1)1 000
所有的移位都是针对于补码
右移>>(用符号位填充高位)
补码:1_(29个1)10
反码:1_(29个0)01
源码:1_(29个0)10
结果:-2
无符号右移>>>(用0填充高位)
补码:00_(28个1)10=1073741822
正数的原、反、补都是一样的,所以直接转换为十进制。
左移<<(用0填低位)
源码:1_(23个0)10000001
反码:1_(23个1)01111110
补码:1_(23个1)10000001
左移后:
补码:1_(21个1)0111111100
反码:1_(21个0)1000000011
源码:1_(21个0)1000000100
结果:-516