java--数据类型和运算符备忘知识点

来源:互联网 发布:n反斜杠百分之d c语言 编辑:程序博客网 时间:2024/06/05 05:29

摘自《疯狂Java讲义》

整形取值范围相关

byte:内存占8位,表示范围 -128(-2^7)~127(2^7 - 1)
short:内存占16位,表示范围 -32768(-2^15)~ 32767(2^15 - 1)
int:内存占32位,表示范围(-2^32)~(2^32 - 1)
long:内存占64位,表示范围(-2^64)~ (2^64 - 1)

问题:拿byte举例,为什么表示范围是(-2^7)~(2^7 - 1)呢?
由于java是用二进制补码来表示一个数,例如一个byte的值为5,则其二进制表示为00000101,值为-5时,二进制表示为11111011,又因为byte占8位,所以从00000000~01111111是从0到127,但是从11111111到10000000为什么是-128到-1呢,为什么不是-127到-1呢,有两种方式可以判断这个原因,第一种方式,我们观察正数的情形,00000000-011111111有128个数,大小从0~127,而负数情形10000000~11111111共128个数,从-128~-1,他们的差别实在正数情况下需要一个表示0的数。第二种方式,计算法,算两个边界,补码10000000的值是-128,为11111111值是-1(计算方法:正式的补码为原码,负数的补码为其绝度值取反加一)

直接给出一个整数值默认就是int类型
如果将一个较小的整数(在byte和short范围内)赋值给一个byte和short变量,系统会自动把这个值当成byte或short处理,而如果把一个较大的数(超过int范围),java不会自动把这个整数当成long类型处理,若希望系统把他当成一个整形long类型处理,需要在值后跟L或者l

浮点型

java语言的浮点型默认double,如果希望java把一个浮点型当做float表示需要在值为加f
特殊浮点型:正无穷大Double.POSITIVE_INFINITY,Float.POSITIVE_INFINITY,负无穷大Double.NEGATIVE_INFINITY,Float.NEGATIVE_INFINITY和非数Double.NaN,Float.NaN
注意:
- 所有的正无穷大数值都是相等的,所有的负无穷大数值都是相等的,为NaN不与任何数值相等,甚至和NaN都不相等
- 只有浮点数除以0才可以得到正无穷大和负无穷大,因为java语言自动把和浮点运算的0(正数)当成0.0处理,如果一个整数除以0,则得到一个异常Exception in thread “main” java.lang.ArithmeticException: / by zero

新表示法

当程序中的数值位数过多时,可以在数值中间加“_”来分辨位数
eg:

public class AAA {    public static void main(String[] args){        int i = 1_000_000_000;        i = i/10;        System.out.print("============"+i);    }}

表达式类型的自动提升

  • 当一个表达式中包含多种类型,整个算数表达式的类型将自动提升,提升规则,所有byte、short、char提升为int
  • 整个算数表达式的值提升为与表达式中包含的最大级别类型

常量池
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据(包括类、方法、接口中的常量、字符串直接常量)

除法的特例
如果除法的两个操作数都为整型,则除数不能为0,否则将抛出上述异常。但如果操作数有一个为浮点型,或者两个都是浮点型除数可以为0,或者0.0得到的是正无穷大或负无穷大
eg:

public class AAA {    public static void main(String[] args){        double i = 1;        i = i/0;        System.out.print("=====" + i);    }}

输出结果为=====Infinity

移位运算

  1. 对于(byte、short、char)都是先转化为int,在一位运算
  2. 对于int类型额整数移位,a>>b 当b>32,系统现将b对32求余,得到的结果才是真正的移位位数,对于long也是如此,将对64求余
  3. 进行位运算不会改变操作数本身,只是得到一个新的运算结果,而原来的操作数本身不会改变。
    eg:
public class AAA {    public static void main(String[] args){        int i= 1;        System.out.print("移位="+(i<<1));        System.out.print("i="+i);    }}

扩展后的复制运算

a = a + 1; a+=1看似是相同的操作,其实,他们只是结果相同,但是运行机制并不相同,网上资料显示,建议第二种方式

这里写图片描述
这里写图片描述

==操作符
如果比较的是值类型,尽管他们的数据类型不同,只要值相同,也会返回true 97==’a’

逻辑运算
短路 && 、||
不短路&、|

0 0
原创粉丝点击