美文网首页
Java基础 - 类型和运算

Java基础 - 类型和运算

作者: ADMAS | 来源:发表于2019-04-15 17:13 被阅读0次

    11.类型和运算

    11.1进制

    对于任何一种进制---X进制,就表示某一位置上的数运算时是逢X进一位后自己归0。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

    计算机中的进制:

    • 二进制:由两个基本数字0,1组成,运算规律是逢二进一。计算机都使用二进制存储数据.
    • 八进制:由0、1、2、3、4、5、6、7组成,运算规律是逢八进一.
    • 十进制:由0,1,2、3、4、5、6、7、8、9组成.
    • 十六进制:由0~9以及A,B,C,D,E,F组成.

    二进制数系统中,位简记为b,也称为比特,位是数据存储的最小单位.

    每个二进制数字0或1就是一个位(bit)。其中8 bit 就称为一个字节(Byte)

    • 1B(byte,字节)= 8 bit;
    • 1KB(Kibibyte,千字节)= 1024B;
    • 1MB(Mebibyte,兆字节,百万字节,简称“兆”)=1024KB;
    • 1GB(Gigabyte,吉字节,十亿字节,又称“千兆”)=1024MB;
    • 1TB(Terabyte,万亿字节,太字节)=1024GB;

    进制的转换:

    • 十进制和X进制之间转换:

      十进制--->八进制/十六进制/X进制

      十进制转X进制,使用倒除法,让被除数每次都除以X,所得的商如果大于了X,那继续除,并且记录好每次所除留下来的余数,然后把最后留下的商和余数的反写拼在一起就是结果

    • X进制和十进制之间转换

      八进制/十六进制/X进制 ---> 十进制:

      X进制转十进制,把这个X进制数从末位开始分别乘以X的n-1次方(n表示第几个数位),所得的权再相加

    11.2 原码 反码 补码###

    在计算机内,有符号数有3种表示法:原码、反码和补码

    所有数据的运算都是采用补码进行的,存储也是用补码

    1. 原码

      最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小

    2. 反码

      正数的反码与原码一样

      负数的反码是对其原码逐位取反,但符号位除外。

    3. 补码

      正数的补码与原码一样

      负数的补码是在其反码的末位加1。

    例子:

    +3(0000 0011) 
    
    原码,反码,补码都是0000 0011
    
    -3(1000 0011) 
    
    原码:1000 0011    反码:1111 1100  补码:1111 1101
    

    11.3 常量和变量

    1. 常量

      常量分类:

      • 字面量/直接量:一个写死的固定不变的值,如整数1/2/3/110等等。小数3.14。布尔常量true/false等

      • final修饰的变量

    2. 变量

      • 变量的特点:

        1. 占据着内存中的某一块存储区域;

        2. 该区域有自己的名称(变量名)和类型(数据类型);

        3. 可以被重复使用;

        4. 该区域的数据可以在同一类型范围内不断变化;

      • 定义变量的语法:

        1. 先定义变量,再赋值:

          数据类型 变量名;

          变量名 = 值;

        2. 或在声明时同时赋值:

          数据类型 变量名 = 初始化值;

    11.4 数据类型

    分类

    1. 基本数据类型,又称为原生数据类型;

      1. 整数型: byte、short、int 、long

      2. 浮点数型:float、double

      3. 字符型: char

      4. 布尔型: boolean

    1. 引用数据类型,又称为对象数据类型,包括类,接口,数组等;

    基本数据类型

    1. 布尔型boolean

      1位, 该类型的值只能是true 或 false,表示真或假。

    2. 整数类型

        类型     占位(字节)      范围
       byte        1       [-128 ~ 127]
                
       short       2       [-32768 ~ 32767]
                
       int         4       [-21E ~ 21E]
                
       long        8       [-9*10^18 ~ 9 *10^18]
      
      • 一个整型的字面量默认是int类型.

      • 声明long型变量后加上‘l’或‘L’,因小写的l容易和数字1相混淆,建议使用大写L。

    3. 浮点型

         类型     占位(字节)      范围
        float           4       [-3.4E38 ~ 3.4E38]   
    
        double          8       [-1.7E308 ~ 1.7E38] 
    
    - float表示单精度类型,double表示双精度类型,但是二者都不能表示精确的小数。
    
    - Java的浮点类型常量有两种表现形式:
     
        - 十进制形式: 例如:3.14 ,168.0, 0.618
        
        - 科学计数法形式: 例如:3.14e2, 3.14E2, 1000E-2
         
        - 科学计数法表达式返回的结果是double类型。
    
    - 一个浮点类型的字面量默认是double类型
    
    - 若要声明一个常量为float型,则需在常量后加上f  或 F,double常量后面的D或d可省略。
    
    - 注意:Java里只有浮点型的变量才可以接受科学计算式结果
    
    1. 字符型

      • char类型,只能存储1个字符,使用的是16位的无符号整数或者Unicode字符,Java对字符采用Unicode字符编码

      • Unicode是一种跨平台的编码方式,Java的字符占两个字节,可以表示一个汉字。

      char常量的主要表示形式:

      • 直接使用单个字符来指定字符常量,格式如'◆'、'A','7';

      • 直接作为整数类型使用,但是数据范围在[0,65535],格式如97,但是打印出来的值依然是ASCII码表对应的图,如97打印出来是字符a。

    转义字符

    \ 就是转义字符

    1. 将普通字符转为特殊用途,一般是编程语言中,用于表示不能直接显示的字符。

       tab建 --> \t     换行 --> \n
      
    2. 用来将特殊意义的字符转换回它原来的意义。

       双引号("),单引号('),反斜线(\)
      

    类型转换

    • boolean不属于数值类型,不参与转换.

    • short与char不能相互转换

    • 自动类型转换

      也称为“隐式类型转换"

      • 当把小数据范围类型的数值或变量赋给另一个大数据范围类型变量,系统可以完成自动类型转型。

      • 当常量值在变量范围内,会自动转换, byte b1 = 100;

    • 强制类型转换

      也称为“显示类型转换"

      • 当把大范围类型的数值或变量赋给另一个小范围类型变量时,此时系统不能自动完成转换,需要加上强制转换符

      • 可能造成数据精度的降低或溢出,所以使用时要格外注意。

          byte a = (byte)128; //输出 a 的值为 -128
        
          原因: 128 默认是int型  0000 00000 0000 0000 0000 0000 1000 0000   以int类型计算十进制值为128
          
          强制转换成byte类型后    1000 0000  此时以byte类型计算十进制值为-128
        
    • 表达式类型的自动提升

      当一个算术表达式中包含多个基本数据类型(boolean除外)的值时,整个算术表达式的数据类型将在数据运算时出现类型自动提升

      提升规则:

      1. 所有的byte、short、char类型被自动提升到int类型;

      2. 整个表达式的最终结果类型被提升到表达式中类型最高的类型;

      基本类型中只要看到了double参与运算,结果一定是double

    11.5 Java运算符

    1. 算术运算符

      • 加号:在操作数值、字符、字符串时其结果是不同的

        • 当两个字符相加得到的是ASCII码表值,

        • 当两个字符串相加时表示将两个字符串连接在一起,从而组成新的字符串。

      • 除号:整数在使用除号操作时,得到的结果仍为整数(小数部分忽略),当整数除以0的时候,会引发算术异常。

          正无穷大(Infinity):正整数除以0.0时;
          负无穷大(-Infinity):负整数除以0.0时;
          NaN(Not a Number):当0.0除以0.0时,浮点数或整数%0.0
        
      • 取模:模数的符号忽略不计,结果的正负取决于被模数.

          5 % -2  输出1
        
      • 无穷大和NaN都属于double浮点类型,但是所有正无穷大都是相等的,所有负无穷大也是相等的,NaN永远不相等,也不等于自己.

      • 数据溢出问题:

          int max = 2147483647;
          int min = -2147483648;
        
          max + 1     输出-2147483648
          min - 1         输出2147483647
        
      • 自增:++,递增操作符,使变量值增加1,有前置和后置之分,只能操作变量。

        唯一的区别是:

        • 前置(++result): result+1 之后再输出值

        • 后置(result++): 先输出值,再result+1。

        如果仅仅执行简单的递增操作(只写result++或++result),那么选用任意一个都可以。

      • 自减: -- ,递减操作符,使变量值减去1,有前置和后置之分,只能操作变量。

    2. 赋值运算符

      专门为变量指定值或重新指定值

       =   赋值
       +=  -=  *=  /=  %=
      
    3. 比较运算符

       ==:等于,若比较的是两个操作数都是数值类型,即使他们的类型不同,只要值相同就返回true。 
      
       !=   <  >   <=  >=
      
       instanceof  检查是否是类的对象
      
    4. 三元运算符

      语法格式:X ? Y :Z,

      其中x为boolean类型表达式,先计算X的值,若X结果为true则整个三目运算表达式的结果是Y,否则就是Z

    5. 逻辑运算符

      用于操作两个boolean类型的变量或常量,结果类型也是boolean。

       &:  表示并且,当操作数A和B都为true结果才为true,否则结果result 是false。
      
       &&: 和&结果相同,具有短路效果,如果左边操作数A是false,result 一定为false,且不运行B的运算。
      
       |:  表示或者,A和B都为false结果result为false,只要有A或B是true,结果就是true。
      
       ||: 和|结果相同,具有短路效果,如果左边操作数A是true,result一定为true,且不运行B的运算。
      
       ^:  判断A和B是否不同,不同则为true,相同则为false。
      
       !:  取反,!true结果是false,!fasle结果是true。
      
    6. 位运算符

      遵循规则:1相当于true,0相当于false

      &:参与运算的两个数,若相应位数的值都为1,则该位结果值是1,否则是0。

      |:参与运算的两个数相应位中只要有一个1,结果就是1。

      ^:参与运算的两个数相应位相同则结果为0,否则为1。

      ~ :表示把每个二进制位的“1”换成“0”,把“0”换成“1”。

      << : 左移位

      >> : 右移位 补位是使用源数据的最高位来补

      >>> : 无符号右移位 补位都用0来补,不管最高位是什么

      示例代码:

        //0b开头表示二进制数, _是用来区分位数
        int num1 = 0b0000_0000_0000_0000_0000_0000_0000_0101 //5
        int num2 = 0b0000_0000_0000_0000_0000_0000_0000_0011 //3
      
       num1 & num2     //...0000_0001 ->1
       num1 | num2     //...0000_0111 ->7
       num1 ^ num2     //...0000_0110 ->6
      
       ~num2           
       //取反后:0b1111_1111_1111_1111_1111_1111_1111_1100  为负数
       负数则需要取补码来计算,补码为...0000_0100 ->4
      
       num2 << 2   //0b0000_0000_0000_0000_0000_0000_0000_1100 ->12
      
       num1 >> 2    //0b0000_0000_0000_0000_0000_0000_0000_0001 
      
       -num1       //11111111111111111111111111111011 -->计算出来的是-3的补码
      
       -num1 >> 2      //补位都用0: 00111111111111111111111111111110 ->1073741822
      
       -num1 >>> 2     //补位用最高位: 11111111111111111111111111111110 ->负数用补码计算:-2

    相关文章

      网友评论

          本文标题:Java基础 - 类型和运算

          本文链接:https://www.haomeiwen.com/subject/twtniqtx.html