- 进制转换
- 十进制 二进制互转
- 二进制 八进制互转
- 二进制 十六进制互转
- 十进制 八进制互转
- 十进制 十六进制互转
- 类型的转换
- 基本类型的类型转换
- 自动转换(隐式转换)
- 强制转换(显式转换)
- 基本类型的类型转换注意事项
- 两种常见的输出语句
- 换行输出语句
- 直接输出语句
- 常量
- 常量的注意事项
- 运算符
- 算术运算符
- 四则运算符和取余运算符
- +号的多种用法
- 自增自减运算符
- 赋值运算符
- 关系运算符
- 逻辑运算符
- 单独逻辑运算符
- 短路逻辑运算符
- 三元运算符
- 原码,反码,补码
- 底层存储和操作数据的过程分析
- 位运算符
- 按位运算符
- 移位运算符
- 总结
- 常见问题
- 在内存中,每创建一个float类型变量,占内存4个字节,每创建一个long类型变量,占内存8个字节,为什么float类型可以存储long类型数据?
- println()和print()什么区别呢?
- 思考题
- 答案
- 运算符的优先级
十进制转二进制: 除以2取余数
二进制转十进制:乘以2的幂数
二进制 八进制互转二进制转八进制:二进制从后往前依次3位转8进制得出来的数首位添加0
例如:11101001 -> 011-101-001 -> 3-5-1 -> 0351
八进制转二进制:把每个数子都拆分为二进制进行拼接
例如:0357 -> 000-011-101-111 -> 11101111
二进制 十六进制互转二进制转十六进制:二进制从后往前依次4为转16进制得出来的数首位添加0X
例如:11101001 -> 1110-1001 -> E-9 -> 0xE9
十六进制转二进制:把每个数子都拆分为二进制进行拼接
例如:0x3AF -> 0011-1010-1111 -> 001110101111
十进制 八进制互转十进制转八进制:除以8取余数
八进制转十进制:乘以8的幂数
十进制 十六进制互转十进制转十六进制:除以16取余数
十六进制转十进制:乘以16的幂数
类型的转换含义:
将一种数据类型的数据转换为另外一种数据类型的数据
分类:
基本类型的类型转换
引用类型的类型转换(暂不涉及)
基本类型和包装类型的类型转换(暂不涉及)
基本类型和字符串类型的类型转换(暂不涉及)
含义:
将一种基本类型的数据转换为另外一种基本类型的数据
分类:
自动转换(隐式转换)
强制转换(显式转换)
格式:
数据类型1 变量名 = (数据类型1)数据类型2的变量值;
含义:
将取值范围较小的数据类型转换成取值范围较大的数据类型
关系:
基本类型取值范围从小到大的关系:
byte < short < int < long < float < double
char < int < long < float < double
注意:
1.基本类型间的转换是七种数值类型间的转换,boolean类型无法进行转换
2.自动转换也可以使用类型转换的格式,往往将(数据类型)省略不写
含义:
将取值范围较大的数据类型转换成取值范围较小的数据类型
格式:
取值范围较小的数据类型 变量名 = (取值范围较小的数据类型)取值范围较大数据类型的变量值;
注意:
在实际应用中尽量避免使用基本类型的强制转换,可能会发生数据的精度损失或数据溢出
1.类型类型的自动转换和强制转换都可以使用基本类型转换的格式,自动转换可以省略不写(数据类型);
2.基本类型间的转换是七种数值类型间的转换,boolean类型无法进行转换
3.在实际应用中尽量避免使用基本类型的强制转换,可能会发生数据的精度损失或数据溢出
4.byte,short,char这三种基本类型只要参与数学运算,先自动提升成int类型,再参与数学运算;如果没有数学运算,依旧按照基本类型的自动转换关系进行转换
两种常见的输出语句 换行输出语句含义:
将内容进行输出打印,并进行回车换行操作
格式:
System.out.println(内容);
注意:
当换行输出语句没有任何输出内容时,直接进行换行处理
含义:
将内容进行输出打印,不进行其它操作
格式:
System.out.print(内容);
注意:
当直接输出语句没有任何输出内容时,程序"编译报错"
含义:
在程序执行的过程中,其值不可以发生改变的量
分类:
自定义常量(暂不涉及)
含义:由开发人员定义的常量,并且有final关键字进行修饰
字面值常量
含义:单独的数据值,无法直接进行使用,需要结合其它语句进行使用
分类:
整数字面值常量
浮点字面值常量
字符字面值常量
布尔字面值常量
字符串字面值常量
空常量(暂不涉及) : null
注意:
字面值常量无法单独使用,需要结合其它语句进行使用
null无法在输出语句中进行打印
1.在给byte,short,char这三种数据类型进行整数赋值操作时,初始化值如果是字面值常量,且该初始化值还在其数据类型的取值范围内,JVM中的存储常量的内存区域会将其自动优化为该数据类型,将这一过程称之为"常量优化机制"
2.在给变量进行初始化赋值操作时,如果初始化值是一个表达式,运算符号两边的数据都是字面值常量,且运算的结果还在其数据类型的取值范围内,JVM中的编译器在编译器自动将其运算完毕,将这一过程称之为"常量优化机制"
运算符含义:
在程序中用来连接常量或变量的运算符号
表达式:
含义:
在程序中用运算符连接起来的式子
常见的运算符:
算术运算符
赋值运算符
关系运算符
逻辑运算符
三元运算符
位运算符
含义:
进行常量或变量算术操作的运算符
分类:
四则运算符
+ - * /
取余运算符
%
自增运算符
++
自减运算符
–
含义:
针对常量或变量进行数学运算的运算符
注意:
/是获取两个数相除的商
%是获取两个数相除的余数
1.加法运算符
2.字符串连接符
当+号两边中的任意一边出现了字符串时,+号不再起到加法运算符的作用,而是变成了字符串连接符,将运算符两边的内容进行连接操作
含义:
在变量的自身数据基础上进行+1或-1的运算符
注意:
自增自减运算符只能变量进行使用,常量无法进行使用
格式(以++为例):
++变量名 或者 变量名++
分类:
单独使用
++在前和++在后的结果是一样的
复合使用
如果++在前,先自增,再使用
如果++在后,先使用,在自增
含义:
针对变量或操作进行赋值操作的运算符
分类:
直接赋值运算符
=
复合赋值运算符
+= -= *= /= %= …
含义:将运算符两边的结果进行运算操作(取决于=之外的符号),再将运算的结果赋值给左边的变量
注意:
复合的赋值运算符再将左右两边运算的结果赋值给左边的变量之前,会根据左边变量的数据类型隐藏做了一步强制转换
含义:
比较变量或常量之间关系的运算符
分类:
< <= > >= == !=
注意:
关系表达式的结果一定是boolean值
==:比较基本类型数据值是否相等
!=:比较基本类型数据值是否不等
含义:
用来连接结果是boolean值表达式的运算符
分类:
单独逻辑运算符
& | ^ !
短路逻辑运算符
&& ||
运算符&:
含义:
与,且
特点:
有false则false
场景:
判断多个条件是否同时满足
运算符|:
含义:
或
特点:
有true则true
场景:
判断多个条件是否至少满足其中一条
运算符^:
含义:
异或
特点:
相同则false,不同则true
场景:
判断多个条件结果是否不一致
运算符!:
含义:
非
特点:
非true则false,非false则true
场景:
针对boolean值结果进行取反
&和&&的区别:
&和&&的结果是一样的;&&具有短路效果,当&&前面表达式的结果为false时,后面的表达式不会被执行;&无论前面表达式结果的值是true还是false,后面表达式都会被执行
|和||的区别:
|和||的结果是一样的;||具有短路效果,当||前面表达式的结果为true时,后面的表达式不会被执行;|无论前面表达式结果的值是true还是false,后面表达式都会被执行
含义:
含有三个未知量的运算符
格式:
关系表达式 ? 结果值1 :结果值2
流程:
1.先确认关系表达式的结果是true还是false;
2.在获取关系表达式结果的同时,统一结果值1和结果值2的数据类型
3.如果是true,执行"统一数据类型后的"结果值1;
如果是false,执行"统一数据类型后的"结果值2;
相同点:
1.原码,反码,补码都是特殊的二进制形式表示法
2.原码,反码,补码在二进制数据中规定的符号位,最高位即为符号位,正数为0,负数为1
3.原码,反码,补码在二进制数据中根据在内存中占用字节大小进行足位存储,不足位数通过补0进行占位
例如:int num = 2;
普通二进制:10
特殊二进制:
00000000 00000000 00000000 00000010
不同点:
原码:计算机中显示数据的二进制特殊表示形式
反码:进行原码和补码相互转换的中间量
补码:计算机中底层进行数据运算的二进制特殊表示形式
1.显示数据==>数据原码
(1)根据显示数据占用字节数确定二进制的总位数
(2)根据显示数据的正负确定二进制原码的符号位
2.数据原码==>数据反码
如果符号位是0,数据反码与其原码相同
如果符号位是1,数据反码在其原码的基础上进行逐位取反,符号位保持不变
3.数据反码==>数据补码
如果符号位是0,数据补码与其反码相同
如果符号位是1,数据补码在其反码的基础上进行+1运算
4.操作补码==>结果补码
根据实际需求进行运算操作
5.结果补码==>结果反码
如果符号位是0,结果反码与其补码相同
如果符号位是1,数据反码在其补码的基础上进行-1运算
6.结果反码==>结果原码
如果符号位是0,结果原码与其反码相同
如果符号位是1,数据原码在其反码的基础上进行逐位取反,符号位保持不变
7.结果原码==>结果数据
(1)将除符号位外,所有二进制数进行将十进制的转换
(2)如果符号位是1,在十进制结果数据的前面补上负号
将int类型的130强制转换成byte类型后,结果为-126的存储操作过程:
1.显示数据==>数据原码
数据原码:00000000 00000000 00000000 10000010
2.数据原码==>数据反码
数据反码:00000000 00000000 00000000 10000010
3.数据反码==>数据补码
数据补码:00000000 00000000 00000000 10000010
4.操作补码==>结果补码
结果补码:10000010
5.结果补码==>结果反码
结果反码:10000001
6.结果反码==>结果原码
结果原码:11111110
7.结果原码==>结果数据
结果数据:-126
含义:
直接针对二进制位进行操作的运算符
分类:
按位运算符
& | ^ ~
移位运算符
<< >> >>>
运算符&:
含义:
按位与
特点:
当两位相同时为1时才返回1,包括符号位
运算符|:
含义:
按位或
特点:
当两位有一位为1即可返回1,包括符号位
运算符^:
含义:
按位异或
特点:
^:按位异或,当两位相同时返回0,不同时返回1,包括符号位
运算符~:
含义:
按位非
特点:
~:按位非,将操作数的每个位上的数字全部取反,包括符号位
左移运算符<<:
含义:
将二进制位往左移动指定的位数,包含符号位
格式:
数据 << 位数
特点:
将二进制位往左移动指定的位数,符号位也随之移动,如果低位出现了空位,补0进行占位操作
右移运算符>>:
含义:
将二进制位往右移动指定的位数,包含符号位
格式:
数据 >> 位数
特点:
将二进制位往右移动指定的位数,符号位也随之移动,如果高位出现了空位,补和符号位相同的数字进行占位操作
无符号右移运算符>>>:
含义:
将二进制位往右移动指定的位数,无需关注符号位
格式:
数据 >>> 位数
特点:
将二进制位往右移动指定的位数,符号位也随之移动,如果高位出现了空位,补0进行占位操作在补码的基础上进行操作
<< 根据移动后的符号位判断正负
<< 正数 右边补0 符号位会改变
<< 负数 右边补0 符号位会改变
>> 负数得负数, 正数的正数
>> 正数 左边补0 符号位不变
>> 负数 左边补1 符号位不变
>>> 无论正负运算后都是正数
>>> 正数 左边补0 符号位会改变
>>> 负数 左边补0 符号位会改变
1.基本类型的类型转换只与数据类型的取值范围有关,和所在内存大小无关
2.float类型之所有可以用更少的字节存储更大或更小的数据,因为float或double底层不是十进制小数,而是一套IEEE754浮点计数标准
3.证明long的取值范围小于float的取值范围
long的取值范围中最大的整数 < 263
float的取值范围中最大的整数 > 3.4 * 1038 > 2 * 1038 > 2 * 838 = 2 * (23)38 = 2 * 2114 = 2115 > 263
System.out.println(); 打印完后,会换行。
System.out.print(); 打印完后,不会换行。
思考题1: x=3, x=x++, ++在后, 先将x=3的值赋值给x, 在进行自增,x变成4,但实际结果执行3, 为什么?
int x = 3;
x = x++;
System.out.println("x = " + x);//3
思考题2:按照运算符的优先级,有括号先算括号,先执行i++ + 1,结果2,i变成2,再计算i++ * 2,结果4,i变成3,但是实际结果打印3和3,不是3和4,为什么?
int i = 1;
int j = i++ * (i++ + 1);
System.out.println("i = " + i);//3
System.out.println("j = " + j);//3
答案
运算符的优先级
1.Java中运算符的优先级和数学中的符号的优先级不同,数学中符号的优先级,谁优先级高就优先执行谁, 但程序中的优先级是程序从左到右依次执行,如果碰到比执行运算符优先级更高的运算符, 先将其作为一个整体进行计算 2.当表达式中出现了自增自减运算符,且同时出现了(),需要注意运算符优先级问题 3.当赋值运算符左右两边出现了相同的变量,需要注意运算符优先级问题 4.如果在程序中出现了复合的赋值运算符,先进行拆分,再进行运算,在拆分的时候需要 注意:复合的赋值运算符,将左边的变量和右边的式子进行运算操作,再根据左边变量的数据类型进行 强制转换后赋值给左边的变量,而不是将右边的式子和左边的变量进行运算操作 5.在程序中()只作为一个整体进行运算 6.不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成; 7.不要过多的依赖运算的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用()来控制表达式的执行顺序



