复习_数据类型与运算符
1.数据类型
1.1 整形
int num=10;
- 一个int变量占4个字节
- int类型表示的数据范围:-2^31-- 2^31-1,即-21亿–+21亿
- Java中表示int最大值:Integer.MAX_VALUE
- Java中表示int最小值;Integer.MIN_VALUE
- 运算超出int数据类型的数值范围就会溢出
1.2 长整型数据类型
long num=10L;
- 定义长整型数据初始化数值后面要+L(l)
- 一个long变量占8个字节
- long类型表示的数据范围:-2^63-- 2^63-1
- 长整型最大值:Long.MAX_VALUE
- 长整型最小值:Long.MIN_VALUE
1.3 双精度浮点型变量
double num=1.0;
- 8个字节
1.4 单精度浮点型变量
float num=1.0f;//也可写作1.0F
- 4个字节
1.5 字符类型变量
char ch=‘A’;
- Java中使用单引号+单个字母的形式表示字符字面值
- 字符的本质是一个整数,Java中使用Unicode表示字符
- 一个字符占2个字节,也可表示中文
1.6 字节类型变量
byte value=0;
- 字节类型表示的也是整数,范围较小,-128–127
1.7 短整型变量
short value=0;
- short类型占2个字节,-32768–32767
1.8 boolean类型变量
boolean value=true;
- boolean类型变量只有true和false两种取值
- boolean类型数据不能和其他数据类型替换
1.9 字符串类型数据变量
String name=“zhangsan”;
- Java使用双引号+若干字符表示字符串字面值
- String不是基本数据类型,而是引用类型
1.10 变量的作用域
一般是定义变量所在的代码块
1.11 变量的命名规则
硬性指标:
- 一个变量名只能包含数字,字母,下划线
- 数字不能作为开头
- 变量名对大小写敏感
软性指标:
- 变量名要见名知意
- 变量名不宜使用拼音
- 命名使用小驼峰命名法:studentName
1.12 常量
常量指程序运行时不能发生改变
常量有两种体现形式:
- 字面值常量
- final关键词修饰的常量
final int a=10;
a=20;//编译出错,无法为a重新分配值
被final修饰的常量,在程序运行时不能被修改
1.13 类型转换
Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验.
(1)
先看以下几个代码场景:int 和 long/double 相互赋值
int a = 10;
long b = 20;
a = b; // 编译出错, 提示可能会损失精度.
b = a; // 编译通过.
int a = 10;
double b = 1.0;
a = b; // 编译出错, 提示可能会损失精度.
b = a; // 编译通过.
long 表示的范围更大, 可以将 int 赋值给 long, 但是不能将 long 赋值给 int.
double 表示的范围更大, 可以将 int 赋值给 double, 但是不能将double 赋值给 int.
结论: 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型, 反之则不行.
(2)
- 毫不相干的两种数据类型不能互相转换,比如int和boolean
- 使用字面量常量赋值时,java会自动进行一些检查校验,判断赋值是否合理
比如:
int字面值常量给 byte 赋值
byte a = 100; // 编译通过
byte b = 256; // 编译报错, 提示从int转换到byte可能会有损失
注意: byte 表示的数据范围是 -128 -> +127, 256 已经超过范围, 而 100 还在范围之内
-使用强制类型转换
(1)
int a=0;
double b=10.5;
a=(int)b ;
(2)
int a=10;
boolean b=false;
b=(boolean)a;//编译出错,不兼容的类型
结论: 使用 (类型) 的方式可以将 double 类型强制转成 int. 但是:
1. 强制类型转换可能会导致精度丢失. 如刚才的例子中, 赋值之后, 10.5 就变成 10 了, 小数点后面的部分被忽略.
2. 强制类型转换不是一定能成功, 互不相干的类型之间无法强转.
类型转换小结:
1.不同数字类型的变量之间赋值,表示范围更小的类型能隐式转换为表示范围较大的数据类型
2.如果要把范围大的类型转换为范围小的类型,需要进行强制类型转换,但是可能精度丢失
3.将一个字面值常量进行复制的时候,java会自动针对数字范围进行检查
1.14 理解数值提升
(1)int 和 long混合运算
int a=10;
long b=20;
int c=a+b;//编译出错,提示long转换为int精度丢失
long d=a+b;//编译通过
结论:当 int 和 long 混合运算的时候, int 会提升成 long, 得到的结果仍然是 long 类型, 需要使用 long 类型的变量来接收结果. 如果非要用 int 来接收结果, 就需要使用强制类型转换.
(2)byte和byte的运算
byte a=20;
byte b=10;
byte c=a+b;
System.out.println©;
//编译报错,错误:不兼容的类型,int转换为byte会有精度丢失
结论:
1.byte 和 byte 都是相同类型, 但是出现编译报错. 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误.
2.由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short 这种低于4 个字节的类型, 会先提升成 int, 再参与计算.
正确的写法:
byte a=10;
byte b=20;
byte c=(byte)(a+b);
类型提升小结:
1.不同数据类型进行混合运算,范围小的会提升为范围大的
2.对于short,byte这种小于四个字节的的类型,会先提升成4个字节的int类型,再运算
2.算术运算符
- 基本运算符:+,- ,*,/,%
(1)int/int结果还是int,需要用double来运算
(2)0不能做除数
(3)可以对int取模,也可以对double进行取模 - 增量赋值运算符:+= ,-=, *= ,/=, %=
结论:
1.如果不取自增运算符表达式的返回值,则前置(++i)和后置(i++)没啥区别
2.如果取表达式的返回值,则前置取的是增加后的值,后置取的是增加之前的值 - 关系运算符:== ,!=, <, >, <=, >=
注意:关系运算符表达式返回值是boolean数值 - 逻辑运算符:&&, ||, !
注意:逻辑运算符表达式返回值是boolean数值 - 位运算符:&, |, ~, ^
按位与&:如果两个二进制位都是1,结果为1,否则为0
int a=10;
int b=20;
sout(a&20);
进行按位运算, 需要先把 10 和 20 转成二进制, 分别为 1010 和 10100
按位或 |:如果两个二进制位都是0,结果为0,否则为1
int a=10;
int b=20;
sout(a|20);
按位取反~:0变1,1变0
按位异或^:同0异1