目录
变量的数据类型
基本数据类型
1.整形数据变量
java中整数有四种类型,byte(字节型,1个字节),int(4个字节),short(2个字节),long(8个字节)
类型 | 字节 | 取值 |
byte | 1 | -2^7~2^7-1 |
short | 2 | -2^15~2^15-1 |
int | 4 | -2^31~2^31-1 |
long | 8 | -2^63~2^63-1 |
使用long类型时,如果范围超过int范围,加L后缀
例如:long a=2222222222L;
java没有long long类型,且全都是有符号类型。
2.浮点型数据类型
存储小数类型,float(单精度浮点型),double(双精度浮点型)
java小数默认double,定义float类型时加f后缀,例如:
float a=3.14f
public class HI{
public static void main (String[]args){
// float a=3.4;//error
double a=3.14;
System.out.println(a);
float b=3.14f;
System.out.println(b);
}
}
float a=3.4;//error 3.4默认为double类型
3.字符类型
public class HI{
public static void main (String[]args){
char a='和';
System.out.println(a);
char b=97;
System.out.println(b);
}
}
char ch=‘和’;---->可以运行--->char是2个字节
char ch=97;--->结果输出a--->java中char类型的变量的数字,计算机会自动将数字转化为所对应的字符。
4.布尔类型变量
java中boolean类型只有两个值:true和false
在JVM规范中,没有规定boolean类型的大小
public class TEXT {
public static void main(String[] args) {
boolean flag1=true;
boolean flag2=false;
System.out.println(flag1);
System.out.println(flag2);
}
}
变量的类型转化
1.自动类型转化
当把类型取值范围小的数值直接赋值给另外一个取值范围大的数据类型变量,系统会产生自动类型转化。
java的自动类型转化图
1.long可以转化为float
根据国际标准IEEE754,任何一个二进制浮点数都可以表示为
●(-1)^S×M×2^E
● (-1)^S表示符号位,S=1,为负数,S=0为正数
● M表示有效数字,大于等于1,小于2 使用二进制形式
●2^E表示指数位
规定:对于32位浮点数,最高位是符号位S,下来的8位是指数E,剩下的23位是有效数字M。、
(浮点)数值 = 尾数 × 底数 ^ 指数,(附加正负号)
例如:5.5就是101.1 十进制表示为5.5*10^0,二进制表示为1.011*2^2,其中s=0,E=2,M=1.011
十进制的-0.625 二进制就是-0.101,表示为-1.01×2^(-1),S=1,M=-1.01,E=-1
指数位(E):共8位为指数位,范围-127~128。另外,标准中,还规定了,当指数位8位全0或全1的时候,浮点数为非正规形式(这个时候尾数不一样了),所以指数位真正范围为:-126~127。
尾数位(M):二进制形式表示共23位为尾数位。小数部分最高有效位是1的数被称为正规(规格化)形式。小数部分最高有效位是0的数被称为非正规(非规格化)形式,其他情况是特殊值 尾数位大于1,小于2
于是float最大值< 2*2^127=2^128 最小值>-2^2^127=-2^128
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
long类型有8个字节,64个bite位,最大值2^63-1,最小值-2^63
所以说float的表示范围大于long
补充:
E是无符号类型整数。E是8位时,范围是0~255,E是11位时,范围是0~2047,但是,科学计数法中的E可以是负数,所以说存入内存的真实的E需要加127或者1023,例如:
float a=5.5 写成二进制:101.1 即表示为1.011×2^2 S=0,M=1.011,E=2
内存的存储方式 E=2+127=129 二进制1000 0001
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
将E取出时:减去127得到真实的E
2.char和int的转化
char的各种字符有对应的ASCII码值,char类型转化称为int类型,得到编码值。
一个汉字能转换成数字int类型吗?答案是可以的,因为计算机对汉字的储存也是通过某种编码规则相对应的数字来储存的。
class HI {
public static void main(String[] args) {
char a='c';
int b=a;
//'c'的ASCII码值是99,那么b得到了'c'的ASCII码值
System.out.println(b);
char c='韩';
int d=c;
//'韩'对应的Unicode编码是38889,那么d就是38889
System.out.println(d);
}
}
2.强制类型转换
强制类型转化指的是两种数据类型之间的转化需要显示声明。当两种数据类型彼此不兼容,或者目标类型取值范围小于源类型时,自动转化无法进行,需要进行强制类型转化。
public static void main(String[] args) {
int a=127;
// byte b=a;//error int类型不自动可以转化为byte
byte b=(byte)a;//强转,且a在byte的范围之内
System.out.println(b);
int m=129;
byte n=(byte)m;//强转,且m不在byte的范围之内,会有误差
// byte s=128;//error 128不在byte的范围之内
System.out.println(n);
byte Max=3 ,Min=4;
// byte Ans=Max+Min;//报错 两个byte被提升成整形,结果是整形
byte Ans=(byte)(Max+Min);
System.out.println(Ans);
boolean l=false;
// int b=(int)l; //error 类型不匹配
int p=2;
long t=3L;
//int y=p+t;//error int+long 小的类型和大类型一起参与运算,自动提升类型
long y=p+t;
}
3.int和字符串的转化
c语言中转化需要使用atoi函数,java可以直接转化。
Integer是int的包装类 ,包装类里面有方法,可以进行int和string转化的相关操作
public static void main(String[] args) {
String a="123";
int ret=Integer.valueOf(a);
System.out.println(ret);
System.out.println(ret+2);
System.out.println(Integer.valueOf(a));
int s=12;
String str=String.valueOf(s);
System.out.println(str);
}
Java的标识符
java标识符由字母,数字,下划线(_)和美元符号($)组成,但是不能以数字开头,也不可以是java的关键字
c标识符由字母,数字,下划线(_)组成,但是不能以数字开头,也不可以是c的关键字
Java有字符串类型,c语言没有字符串类型
String是引用类型
+的使用---字符串拼接
class HI{
public static void main (String[]args){
String str="Hello";
System.out.println(str+"world");
System.out.println(str+10+20);
System.out.println(10+20+str);
System.out.println("10"+"20"+str);
System.out.println(str+(10+20));
}
}
转义字符
class HI {
public static void main(String[] args) {
System.out.println("bit");//bit
System.out.println("\"bit\"");//"bit"
System.out.println("\\bit\\ ");// \bit\
System.out.println("/bit/");// /bit/
}
}
常量
字面常量:例如:10 90
字符常量:例如:‘1’,‘a'
字符串常量:例如:"asd"
final修饰的常量---不可更改
c语言有const修饰的常变量,java用final修饰
final int a=10;
a=99; //报错 a是常量
运算符
算数运算符
加减乘除四则运算,这里强调下除法
进行除法运算时,当除数和被除数都是整数时,得到的也会是整数,有小数参与运算时得到小数。
public static void main(String[] args) {
System.out.println(1/2);//0
System.out.println(1.0/2);//0.5
}
取模运算
取模运算时,符号取决于被模数(%左边的符号)
java中可以对小数求余数
public static void main(String[] args) {
System.out.println(-10%3);//-1
System.out.println(-10%-3);//-1
System.out.println(10%3);//1
System.out.println(10%-3);//1
System.out.println(3.5%3);//0.5
}
赋值运算符
在使用+=,-=,*=、/=,%=运算符时,会自动发生强制类型转化
public static void main(String[] args) {
short a=3;
// a=a+3;//error a+3发生整形提升,结果是int类型
a=(short)(a+3);
a+=3;//+=运算符自己发生强制类型转化
System.out.println(a);
}
关系运算符
==,!=,>,>=,<,<=
关系运算符的结果是boolean类型,true和false
public static void main(String[] args) {
System.out.println(3>1);//true
System.out.println(3>=1);//true
System.out.println(3<=1);// false
System.out.println(3==1);// false
}
逻辑运算符
逻辑运算符用于对布尔类型的值进行操作,返回值也是boolean类型
&:操作符两边都是true时,结果是true,但是不管左边是true还是false,右表达式都参与运算
|:操作符两边有一个true时,结果是true,但是不管左边是true还是false,右表达式都参与运算
^:操作符两边相同时,结果是false,不同时结果是true
!:取反
&&:短路与:操作符两边都是true时,结果是true,但是当左边是false时,右表达式不参与运算
!!:短路或:操作符两边有一个true时,结果是true,但是当左边是true时,右表达式不参与运算
位运算符
针对二进制的每一位来进行运算
&:参与运算的两个操作数,按照二进制形式进行&运算,相同位的两个二进制位都是1则为1,否 则是0
00000110
&
00001011
------------
00000010
|:参与运算的两个操作数,按照二进制形式进行|运算,相同位的两个二进制位至少有一个1则为1,否则是0
00000110
|
00001011
------------
00001111
~:针对一个操作数,,按照二进制形式进行~运算,对每个二进制位取反
~00000110
------------
11111001
^:参与运算的两个操作数,按照二进制形式进行^运算,相同位的两个二进制位相异为1,相同是0
00000110
^
00001011
------------
00001101
位操作符:<<,>>,<<<
<<:左移操作符,将二进制位左移,左移部分舍去,右边补0
00000110<<2
___________
00011000
11111111<<1---- -1的补码
------------
11111110---补码 10000010----原码(-2)
>>:右移操作符,将二进制位右移,右移部分舍去,左边补符号位
00001011>>1
-------------------
00000101
11111111>>2---- -1的补码
-------------------
11111111 ---补码(-1)
>>>:无符号右移,右移操作符,将二进制位右移,右移部分舍去,左边补0
00001011>>>1
-------------------
00000101
11111111 111111111 11111111 11111111>>>2---- (-1)的补码
----------------------------------------
00111111 11111111 11111111 11111111---数字:1073741823