分享

Java运算符基本类型强制转化原码补码

 ada_lib 2014-12-19

标识符:identifiers:给程序元素命名的单
规则(规范):A:标识符只能以字母,-,$开头
      B
:能包含字母、数字、-,$
      C
:大小写敏感
      D
:没有固定的长度限制
     
标识符命名习惯(建议):A:类的名字一般都是以大写字母开头,且每个单词首字母大写
        B
:接口每个单词的首字母大写
        C
:方法名和变量名第一个单词小写,以后每个单词首字母大写
        D
:常量(一般使用final来修饰)每个字母大写,单词与单词用_联接
        E
:包名的命名一般是每个字母都小写

规范是必须要遵守的,习惯是俗成约定


关键字:50个保留关键字,这些单词不能用来自己定义变量,有特殊含义
    A
:需注意的:true,false,null这三个单词在JAVA里不算关键字,但是它都代表一个字面值,虽然如此,但意义同关键字
    B
JAVA取消了很多CC++的关键字,如sizeof:求每一个变量在内存中的字节个数,在CC++里,如int a在内存中的大小取决于OS。所以需要计算,而JAVAJVM屏蔽掉了OS的差异性
    C
gotoconstJAVA里被保留了下来,但是一直不用,gotoCC++经常用在多层循环嵌套在内层循环中直接跳出外层循环,在JAVAbreak的功能部分的替代了goto的作用
   
   
*:所有复杂的逻辑问题都可以通过顺序、选择、循环解决
   
   
*基本数据类型:JAVA中的八种基本数据类型
    16
位的
    64
位的双精度实型
    32
位的单精度实型
   
   
四类八种:
    bollean
   
    char
   
    boolean
类型和定义和赋值:要注意的是在CC++0代表假,非0代表真
   
   
文本类型的:
    A
char无符号的16位整型
        ASCII
0-127,英文字母的大小写,数字,标点符号,常用的特殊控制字符,只占一个字节,最多可保存256个不同的数字,28次方
       
我们国家的是GB2312GBKUTF8ISO8859-1
        JAVA
里的统一编码是unicode:每个字符占两个字节,216次方,所以最多有65536种变化:不仅可以保存ASCII码中的数据,还可以存储常用的语言字符,特殊的语言字符
       
乱码的产生原因是因为在保存和解析时所采用的字符编码方式不同
        char ucChar='\u0060':
每一个小字母和大写字线都隔的是32,这样做是因为大变小或上变大容易,这个转换成是96这个字符,但它是特殊符号,在绝大多数编码中在0-127是和ASCII码都是一样的
       
转义字符:'\n'  '\'':表示     '\''':表示" '\\':表示\\
   
   
老师练习:
    A:char c = '0'; 48          int b = 0; 
不等
    B:char c = '\u0000';             int b = 0; 
相等
    C:char c = '8';             int b = 3 + '5';   
相等
    D:char c = '8';             int b = '3' + '5';     
不等
    E:char c = '8';             int b = 3 + 5; 
不等
    F:char c = '\u0000';            char b = '0';  
不等
   
    B
:字符串String不属于八大基本类型
   
SECOND 
   
   
整型:byte,short,int,long
    byte
-128127
   
补码:A:如果是一个正整数,其二进制补码就是二进制原码
          B
:如果是一个负整数,在二进制原码的基础上原码求反,末位加  
         127
0 1 1 1 1 1 1 1
         -128
1 0 0 0 0 0 0 0它和+128的原码是相同的
       
如果一个原码的最高位是0肯定是一个正整数,如果最高位是0就是一个负整数,因此我们称一个原码的最高位就是符号位
        -1
1 1 1 1 1 1 1 1 
      
为什么要用补码的方式来存储负数?这样做是为了进行二进制的运算,比如48-48相加得0
       48
0 0 1 1  0 0 0 0
       -48
1 1 0 1  0 0 0 0
      
      
       int  2
302*210*210*21021024*1024*10242G
      
       byte bb = 0x771
超出范围了,如果0x后面跟的是二位的数字一般都没有超过byte范围
      
      
赋值的范围不能超过左边数据类型的范围
      
强制类型转换:超出部分会被截掉。所以转成小范围的值会造成精度丢失
      
      
      
实型:double float
      
系统默认为double类型
       double da = 123D
如果不加D的话,系统会默认123int类型的,因为没有加小数点。如果不加D就表示把一个整形赋给一个double变量
     
总结:基本数据类型共8种,除了boolean之外,其它的7种数据类型是可以相互转化的,因为它们都是数据类型
    A
:自动类型转换:
       
从小范围的值到大范围的值可以自动转换,因为不会丢失数据和精度
        byte-->short-->int-->long-->float-->double
        char
short不能互换,因为它们之间没有包含关系
        char-->int-->long-->float-->double
        long-->float:
可认为float的范围大,对于存储空间而言,存储空间大范围也就大,对于整数是精确存储,所以整数和存储空间是依依对应的,但是实型数据的存储是近似储存。虽然能够自动进行,但是这种自动转换比较特殊,它有可能丢掉数据
       
int-->float,long-->float,long-->double都会造成数据丢失
    B
:强制类型转换   
       
保证让程序员自己承担强制类型转换的风险
       
反过来就会把高位截掉,只保留相应类型的数据大小
       
实型转成整型:直接截掉小数位
       
       
       
       
THIRD
JAVA
的数据类型:基本类型:四类八种,基本类型是可以直接拿来用的
       
引用类型(对象类型):*类(类的对象就是一个引用类型的值)、*接口、枚举、标注等
       
空类型 void
   
   
引用类型在存储方式上有差异:
   
如:int a = 5;
        JVM
分配连续的四个字节的空间,这连续的四个存储空间将存储5的二进制
        String s = "hello";
hello在这里面就是一个对象)
        Animal a2  = new Animal();
创造Animal的一个对象,并把这个对象的首地址传给a2
            a2
在这里是一个引用(保存地址值的引用空间),JVM会给他分配一个连续四个字节的空间,但它保存的是地址址。new Animal生成一个对象空间,把new出来的空间首地址保存在a2中。因此我们可以认为a2指向了这个对象,所以访问就用a2.xxxx去访问
           
引用类型共有两个存储空间:一类是引用空间,一类是对象的实际空间
        A
:对象和引用的关系就旬汽球连着绳子的关系,汽球就是对象,绳子就是引用。
        B
:可以定义多个引用指向同一个对象
            Animal a1 = new Animal();
            Animal a2 = a1;
赋的值就是地址
            Animal a3 = a2;
这三个引用保存的是同一个地址,因为它们指向了同一个对象
        C
:如果一个汽球没有任何绳子连着它,那这个汽球在JAVA中就成了垃圾
            Animal a = new Anilal();
            a = null;
这样一赋,a就不再指向任何一个对象,地址就成释放了。Animal就变成了垃圾。因此没有被任何引用指向的,这个对象就变成了垃圾;
        D
:如果只是有引用,没有对象,JVM就会报异常:NullPointerException空指针异常,产生这种异常的原因是因为只定义了一个引用却没有给它赋值
            Animal a;
            a.name;
           
   
异常:编绎阶段
        A
error错误:语法有问题
        B
warning警告:一般代表逻辑上的问题
         
运行时:
            A
Exception异常:不是很严重的问题,可以通过一些方法进行处理
            B
error错误:不可恢复的,系统级的错误。如递归调用,不停的调用,造成死循环,内存空间的overflow
           
           
总结:数据类型已经讲完

运算符Operators:
    A
:赋值运算符:共12个,复合赋值运算符:11
    B
:关系比较运算符:boolean不能参与大小比较,其它七种数据类型都可以相互比大小。引用类型的值也不能比大小。大小比较只能是七种基本的数据类型
    C
==!=。赋值左边一定是个单独的变量名如:(a+b) = 8 (a-5)=3这两个都不对。右边是任意一个合法符合类型要求的值。boolean可以比相等和不相等。整数数据也可以,实型数据在语法也是可以,但我们经常不拿实型类型比较,因为它们的存储原因double d1 = 0.9  double d2 = 2.0-1.1 if(d1 == d2){}这个返回结果会是假。
   
比较两个实数的大小可以这样比if(Math.abs(d1 - d2) < 1e - 6){} 10-6,让它们的绝对值小于一个足够小的实数。
   
所以基本类型的值可以用来比较相等和不等。引用类型的值也可以。适用于任意的数据类型
    D
:算术运算符
        1
:/当除法运算两边都为整数的时候,他们的结果也是整数
        2
+不仅可以用来做数字的运算,还可以做为联接
   
适用于七种基本的数值类型,+还适用于字符串联接
   
    E
:移位运算符Shift operators;把某一个整数在内存中的存储位置左移或右移,把一个数左移一位相当于*2,左移两位相当于*4,左移n位相当于成n,但是要保证没有移出有效位1。右移就相当于除,但也要保证不能移出有效位1,原来最高位是1就补1,是0就补0,保证数据的正负性不会得到改变
   
无符号右移:左边不管原来最高位的0还是1,左移进来的都是0;不考虑原来数的最高符号位,所以对正数而言,有符号有移和无符号右移都一样,因为补进来的都是0
       
只适用于整数数据
       


FOR    
    F
:位运算Bitwise operators:
       
&:把某一个指定位置为0,某几个位置不变
       
按位或|:同时为0就为0,有一个为1就为1。如果我希望把某一个值指定为位1,指定位不变
       
按位异或^:相同结果为0,相异结果为1;如果我希望某一个数字指定位不变,指定位求反
       
按位求反~:0110
       
~是单目运算符,其它的都是双目运算符???????????
   
   
注以上七种运算符都只能适用于整数参于运算
    G
:逻辑运算符Logic ooperators:用来表达一个复杂的逻辑关系
       
&&:AB同时符合才为真
       
||:两个条件中有一个符合即为真
       
这两个运算符有短路的特性;如果左边算出不成立就忽略掉右边的运算。所以尽量不要在这两种符号的右边不要做赋值的运算。以免对右边的变量的值有影响这两个运算符是从CC++继承下来的
       
&和|:逻辑含义是一样的。但这两个运算符是非短路的,即使左边不成立,右边也会计算
   
注:在逻辑运算符两边参于运算的只能是是boolean类型
       
能过参与这两种参与的数据类型可以区分他们是按位余或者逻辑运算
       
    H
:条件运算符Conditional operators:
        JAVA
语言中的三目运算符:参与运算的有三个变量
        a?b:c
其中aboolean表达式
       
    I
:特殊运算符Other operators:
       
自加++a++==>a=a+1
       
       
注:自加和自减可以出现在变量名之前和之后,两者是有区别的
       
现在这种情况是没区别的a++++a
        b=a++ ==> b=a; a=a+1
        b=++a ==> a=a+1; b=a;
       
a的值是没有区别的,但对b 的值是相同的
       
       
强制类型转换:boolean类型的值不可以和其它数值类型转换,引用类型的值也不可以和基本数据类型互相转换。引用类型值之间可以有条件的强转
       
       
   
注:    1: 在JAVA中()、[]和.这三种优先级很高   
        2
:第二优先级都是单目运算符
        3
:第三优先级的就是算术运算符
        4
:移位运算符
        5
:关系运算符
        6
:位运算<这个不常用,可以不用花时间记>
        7
:逻辑运算符
        8
:条件运算符
        9
:赋值运算    
       
   
运算符的结合性:同一个优先级的运算符出现在一个表达式里,先算哪个后算哪个;就要看他的结合性
   
   
我们可以加括号解决哪个运算符先算的问题 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多