java算术运算
文章目录
一、数据类型中补充的小问题
1、定义long、float时要注意
在定义long或者float类型变量的时候,要加L或者f。整数默认是int类型,浮点数默认是double
byte:short在定义的时候,他们接收的其实是一个int类型的值。这个是自己做了一个数据检测,如果检测到不在short范围内,就会报错
2、byte值的问题
byte范围:-128 ~ 127
byte b1=127; //正赋值不会报错
byte b2=(byte)128; //强制类型转换 出现精度损失 真正存储的值为-128
也就是说强制给byte存储超出范围的数据就会绕回来
比如存128 对应实际是-128
存129 对应实际是-127
3、数据类型转换之默认转换
(1)byte,short,char —— int —— long —— float —— double
- byte short 只要参与运算一律默认转化为int类型:eg. short s=1; s=s+1;会报错 因为“s+1“是int类型,要强制类型转换之后才能赋给s
- 但是如果是short s=1;s+=1;就不会报错。因为扩展的运算符都蕴含了强制类型转换。
(2)long:8个字节 float:4个字节
但是long遇到float会被默认转化成float
原因:
- 它们底层的存储结构不同
- float表示的数据范围比long的范围要大
4、java语言中的字符char可以存储一个中文汉字吗?为什么?
可以。因为java语言中的字符占用两个字节。java采用Unicode编码
二、运算符
*运算符的优先级
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ()、[]、{} | 从左向右 |
2 | !、+、-、~、++、– | 从右向左 |
3 | *、/、% | 从左向右 |
4 | +、- | 从左向右 |
5 | «、»、>>> | 从左向右 |
6 | <、<=、>、>=、instanceof | 从左向右 |
7 | ==、!= | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= | =从右向左 |
1、算术运算符
+、-、*、/、%、++、–
(1)整数相除只能得到整数
(2)%为取余,/为取商
(3)++&–运算符
- 放在操作数前面,先自增/自减,再参与运算
- 放在操作数前面,先参与运算,再自增/自减
2、赋值运算符
有关s+=1:
byte short 只要参与运算一律默认转化为int类型:eg. short s=1; s=s+1;会报错 因为“s+1“是int类型,要强制类型转换之后才能赋给s
但是如果是short s=1;s+=1;就不会报错。因为扩展的运算符都蕴含了强制类型转换。
3、比较运算符
==,!=,>= , <=
比较运算的结果一定是bool类型
4、逻辑运算符
(1)特点:
逻辑运算符一般连接boolean类型的表达式或者值
表达式:就是用运算符把常量或者变量连接起来的符合java语法的句子
算术表达式:a+b 比较表达式:a==b
(2)&逻辑与,|逻辑或,^逻辑异或,!逻辑非
(3)&&和&的区别:①两者的最终结果一样 ②&&具有短路效果,只要判断出(表达式A)&&(表达式B)A为false,就直接判定整个表达式为false,而不会再去执行表达式B的真假值
//常用&&和||以及!
5、位运算符
(1)&,|,^,~
<<(左移), >>(右移), >>>(无符号右移)
要作为运算首先要把数据转换为二进制补码
(2)&位与运算:有0则0;|位或运算:有1则1;^位异或运算:相同则0,不同则1;~按位取反运算:0变1,1变0
3&4:
00000000 00000000 00000000 00000011
&00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000000 结果为0
3|4:
00000000 00000000 00000000 00000011
|00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000111 结果为7
3^4:
00000000 00000000 00000000 00000011
^00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000111 结果为7
~3:
~00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111100
前面说了,进行位运算的都是补码,因为3是正数,所以它的原返补码都相同,但是把3进行按位取反运算之后得到的补码符号位是1,是负数,而负数的原返补码不同,需要进行换算。
换算如下:
补码:11111111 11111111 11111111 11111100
取反:10000000 00000000 00000000 00000011 (符号位不参与运算)
加一:10000000 00000000 00000000 00000100 (原码) 结果为-4
(3)异或的特点:一个数据对另一个数据位异或两次,该数本身不变。
面试题:不借助第三个变量,交换两个整型数据
方法一:异或
int a,b;
a=a^b;
b=a^b; //此时a=a^b;b=b 所以b=(a^b)^b=a;因为a两次异或b保持不变
a=a^b; //此时b=a;a=a^b 所以a=(a^b)^a=b;因为b两次异或a保持不变
方法二:变量相加
int a,b;
a=a+b;
b=a-b;
a=a-b;
方法三:一句话完成(妙啊)
b=(a+b)-(a=b);
(4)左移,右移,无符号右移
- 左移<< :空位补0,被移除的高位丢弃
3<<2 //把3左移2位 把移动的数据乘2的移动次幂
即,结果为3*22
- 右移>>:被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,右移后,空缺位补1。
3>>2 //把三左移两位 把移动的数据除以2的移动次幂
即,结果为3÷22
- 无符号右移>>>:空缺位补0,被移除的低位丢弃
题目:用最有效率的方法写出计算2乘以8的结果:
2*8 => 2<<3 //用左移做乘法效率最高
6、三目运算符
(关系表达式)?表达式1:表达式2;
关系表达式为boolean类型结果为true就运算表达式1,关系表达式为false就运算表达式2
三、键盘的录入
第一步:导包(导入文件):
- 格式:import java.util.Scanner;
- 位置:在class上面
第二步:创建键盘录入对象:
- 格式:Scanner sc=new Scanner(System.in);
第三步:通过对象获取数据:
- 格式:int x=sc.nextInt();
- 也就是把输入的数据放到int x里边
//为什么在eclipse会报错,在intelliJ IDEA就没事
import java.util.Scanner;
class ScannerText
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
System.out.println("请输入数据:");
int x=sc.nextInt();
System.out.println(x);
}
}
四、键盘的输出
1、输出自动换行println
System.out.println("");
2、输出不换行print
System.out.print("");