Java day02

变量&运算符

变量的注意事项

  1. 变量如果没有赋值是不可以直接运算的。
  2. 变量只有在作用域中才可以使用。
    作用域:从变量定义的一行开始,到所在的大括号结束为止。
  3. 变量可以一行定义多个,但不推荐。

类型提升

自动类型提升:数据类型范围小的转换为范围大的。
强制类型转换:数据类型范围大的转换为范围小的,可能会精度损失,不推荐。
格式:范围小的数据类型 变量名 = (范围小的数据类型)范围大的数据类型的值;

整数可以转换为小数,但是可能会精度损失。

		double d = 100;
		System.out.println(d);//100.0

小数转换为整数会强制转换,舍弃全部小数部分。

		int i2 = (int)6.88;
		System.out.println(i2);\\6

byte/short/char在参与运算时会自动提升为int类型。

		char c = 'a';
		System.out.println(c + 1);//97
		
		byte b1 = 10;
		byte b2 = 10;
		// byte = int
		byte b3 = (byte)(b1 + b2);
		System.out.println(b3);

byte/short/char不参与运算,单纯赋值时,如果右边没有超出范围会自动补上一个向上强转,如果右边超出范围,需要手动补上强转。

算术运算符

+ - * / %

除法运算只看商
		int a = 10;
		int b = 20;
		System.out.println(a / b);//0
		System.out.println(10 / 20.0);//0.5
		//System.out.println(1 / 0);// 抛出异常
		System.out.println((0.0 / 0) == (0.0 / 0));// NaN  和自身都不能相等
		System.out.println(1.0 / 0);// Infinity
		System.out.println(-1.0 / 0);//-Infinity
+的多种作用
  1. 数字的相加
  2. 字符的相加
  3. 字符串的拼接
%取余运算符

负数取余,结果的正负只和%左边的正负有关 。

		System.out.println(10 % 3);//1
		System.out.println(3 % 0.8);//0.5999999999999999
		System.out.println(-3 % -1.8);//-1.2
自加自减

前++(- -)先加减再参与运算
后++(- -)先参与运算再加减
单独使用时,前后效果一样
byte/short/char 在使用++(- -)的时候,运算后还是自身类型,java底层会默认提供一个强制类型转换

赋值运算符

基本赋值运算符 =
扩展 +=、-=、*=、/=、%=、&= 、 |= 、 ^= 、 <<= 、 >>= 、 >>>=
隐含了一个强制类型转换

关系比较运算符

==,!=,>,<,>=,<=
结果是布尔类型

逻辑运算符

基本使用:&(与),|(或),^(异或),!(非)

  • 与:& 有false则false
  • 或:| 有true则true
  • 异或:^ 相同则false,不同则true
  • 非:! true则false,false则true

&& 和 & 的区别
单&(|)和双&(|)最终的结果是一样的,但是双&(|)的效率更高
双&(|)有一个短路效果:如果左边的表达式已经能够确定整个表达式的最终结果,那么后面所有的表达式都不用参与运算

运算符的优先级为: () ~ ++ – ! * / % + - << >> >>> 关系 逻辑 & | ^ 三元 赋值
一般很多人是说两者优先级相同,实际呢?
&& 大于||

System.out.println(false && true || true); //true
System.out.println(true || true && false);// false
三元(目)运算符

格式:数据类型 变量名 = (布尔表达式) ? 表达式1 : 表达式2;

  • 布尔表达式结果如果是true,那么将表达式1赋值给变量
  • 布尔表达式结果如果是false,那么将表达式2赋值给变量
  • 注意:右边的表达式数据类型要和左边的匹配
位运算

前提条件:位运算只作用于整数,在使用位运算之前,要先将数字转换为对应的补码

位运算分为:&(与) |(或) ^(异或) <<(左移) >>(右移) >>>(无符号右移) ~取反

  • 按位与:& 两个操作数中位都为1,结果才为1,否则结果为0

    • 任意一个数&一个偶数,结果一定是偶数
    • 任意一个数&1 如果结果是0 就是一个偶数
  • 按位或:| 两个位只要有一个为1,那么结果就是1,否则就为0

    • 任意一个数 | 一个奇数,结果一定是奇数
    • 与0 | 结果还是自身
  • 异或:^ 两个操作数的位中,相同则结果为0,不同则结果为1

  • 左移:<< 左移n位就是乘以2的n次方,左边丢弃,右边补0.

  • 右移:>> 右移n位就是除以2的n次方(正数)。右边丢弃,左边补位(正数补0 负数补1)

    • 负数最大移动到-1,整数最大移动到0
    • 注意:要先转换为补码再进行右移
  • 无符号右移: >>>

    • 和右移类似,但是最高为空出之后,无论正数还是负数,一律补0
  • 取反: ~

    • 将数字转化为二进制之后,1变0,0变1,然后最高位按照-128,其余位按照二进制向十进制的转化规则计算,然后加上-128,如果最高位是0,那么不用计算
    • 取反规律: ~i = -i -1

进制转换

  • 计算机中的进制:
    • (bin)二进制: 0 ~ 1 满2进1 0b0011 以0b作为二进制的标识,在JDK1.7之后可以直接使用
    • (oct)八进制: 0 ~ 7 满8进1 024 以0作为八进制的标识 (dec)
    • 十进制: 0 ~ 9 满10进1
    • (hex)十六进制:0~9 a ~ f 满16进1 0x11 以0x作为十六进制的标识 十六进制中的a-f,不区分大小写
  • 十进制转换为二进制:不断对2取余,然后得到的余数结果倒着排列即可
  • 二进制转换为十进制:从最低位开始,分别乘以2的对应位次幂(从0次幂开始), 最终求和
  • 十进制转换为其他进制:不断对对应的进制取余,然后得到的余数结果倒排
  • 二进制转换为八进制:从最低位开始,每3位看作一组,如果不够3位,那么高位补0, 然后按照二进制转十进制的方式获取结果,结果按顺序排列
  • 八进制转换为二进制:一变三的过程。将八进制中的一位转换为二进制的三位,结果按照顺序排列
  • 二进制转换为十六进制:参考二进制转换为八进制,只是每4位看作一组。
  • 十六进制转换为二进制:参考八进制转换为二进制,只是一变四的过程。

原码,反码,补码

所有的数据在底层都是二进制数据的补码形式存储的

正数的原码反码补码都相同

原码反码补码分为符号位和数值位,最高位位符号位,1代表负数,0代表正数

负数的反码是在原码的基础上符号位不变,其他位按位取反

负数的补码是符号位不变,在反码基础上加1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值