Java基础 - 类型和运算

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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容