第三课 java算术运算

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("");

版权声明:本文为weixin_47067063原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。