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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容