初学java   有几个问题 不是很明白啊!望各位大侠多多指教啊!
   1.    int a=10   则a+=a-=a*=a/=a   在机器上运行  怎么都得10  分别  Int c,d,e,f;
          另c=(a+=a) ;d=(c-=a);e=(d*=a);f=(e/=a)
          最后输出f   等于0     
                这两个计算方法不一样么?每个都是怎么得出结果的?(求2个的详细运算过程)
   2.   关与  位运算符  >>  ,  <<   ,>>>   都能实现什么功能?怎么样各自实现的?
          int a=10;a>>=32       运行后为什么a还等于10呢  ? 请详细解释一下过程
     3.关于java  中可以实现高级数据类型向低级的自动转换  
        byte->short->int->long->float->double 
         long 为64位的  float  为32位   转换时候不会损失么?为什么可以自动转换?        在java   中  浮点型数据  究竟怎么样定义表示的?物理结构怎么划分的。
    多多指教啦!回答任意问题 我都会酌情发分的   谢谢啦!!!

解决方案 »

  1.   

    1.
    a=a+(a=a-(a=a*(a=a/a)))
    ==>a=a+(a=a-(a=a*(1)))
    ==>a=a+(a=a-(10))
    ==>a=a+(0)
    ==>a=a
    ==>a=10;c=(a+=a)==> c=(a=a+a) a=20,c=20;
    d=(c-=a)==> d=(c=c-a)  c=0;d=0;
    ............................
    关注2.3题,特别是3!
      

  2.   

    int a=10  则a+=a-=a*=a/=a 相当执行了以下12句。
    int temp=a;a=a/a;a=temp;
    int temp=a;a=a*a;a=temp;
    int temp=a;a=a/a;a=temp;
    int temp=a;a=a+a;a=temp;
    所以a=10Int c,d,e,f; 
    c=(a+=a) ;d=(c-=a);e=(d*=a);f=(e/=a)
    得出:
    c=10; d=c-a=10-10=0; e=d*a=0*10=0; f=e/a=0/10=02.用于位运算。包括有符号和无符号数的移位运算操作。
    int a=10;a>>=32     其实a在32位字长的机器中根本就没移一位,所以当然保持其的值不变!
    3.long型的和浮点型不能相互转换吧?顺便声明,不是高级能自动向低级的转换,而是低级的能自动向高级转换!
       byte->short->int->long
       float->double
       转换的概念我打个比方给你吧:比如高级的为10升容量的瓶子,低级的为5升容量;如果10升的瓶子有6升水,你直接倒向5升的,不是流失了1升了吗;不过如果10升的刚好只有5升水,倒进5升的瓶子也不会出现问题,然而不管怎么说,一定会有可能出现意外的情况。但是反过来,5升的不管装有多少水,其最大也就为5升。倒进10升的瓶中不会出现任何问题!这个例子你应该能明白转型的问题了吧?
      

  3.   

    long型的和浮点型不能相互转换吧?顺便声明,不是高级能自动向低级的转换,而是低级的能自动向高级转换!3#!!!
      

  4.   


      long l = 1234567890123456789L;
      float f = l;
      System.out.println(String.valueOf(l));
      System.out.println(String.valueOf(f));
    输出为:
    long=1234567890123456789
    float=1.23456794E18你看到了吧:是有损失的;但是损失的是精度!
    因为就大小范围来说,float的范围比long的大,所以可以直接转化
    然而float并不能完整表达出原来的值(按IEEE?标准,32位里只有23位用来表示精度了)
      

  5.   

    第三题想补充下,呵呵,各位大侠看说的对不对。java中有三种自动类型转换会造成数据的丢失:
    1.int->float
    2.long->float
    3.long->double原因是因为,实型的数据最后一个字节是用来存储位权的,也就是科学计数法里边的10的多少次方,存储在这个字节里边,比如说int想要转换成float,那么int的4个字节的数值,会相应的存储到float除开位权那一个字节的前3个字节中,也就是说4个字节存入3个字节,自然会产生数据的丢失,相应的float中的第4个字节中这个时候存储的数就会是0。后边2种情况依次类推也不难解释了,不知道说得对不对,请指教。
      

  6.   

    1. 看2楼: 基本是这样子(除了第一个10应该为a)2. 看3楼:补充就是,移位的话都是对要移的位数按长度取模之后再移的。
    意思是说,3<<2,3<<34,3<<-32最终的值是一样的
      

  7.   

    2楼
    c=(a+=a)==> c=(a=a+a) a=20,c=20; 
    d=(c-=a)==> d=(c=c-a)  c=0;d=0; 
    3楼
    c=(a+=a) ;d=(c-=a);e=(d*=a);f=(e/=a) 
    得出: 
    c=10; d=c-a=10-10=0; e=d*a=0*10=0; f=e/a=0/10=0 
    哪个对呀
      

  8.   

    int a = 10, c;
    c=(a+=a) ;
    System.out.println(a);
    //a为20!
    第二题可能9楼给出了正解。!
      

  9.   

    关于Java的浮点数,完全遵照IEEE754单精度(32位)和双精度(64位)的格式标准,你可以参阅IEEE754的文档了解格式细节
      

  10.   

    第一题上面说的很简单了,还是把第二题说说:
    >>,<<都是有符号移位运算符,比如-8>>2就是说把-8在内存中保存的2进制码向右移三位,比如-8的二进制码:1111 1000
    向右移3位就是1111 10  在补上前两位11就是1111 1110,这是个负数,结果就是-2.左移也是。
    >>>就是无符号右移,比如-1>>>30,就是说把-1在内存中保存的2进制码向右移30位,
     1111....1111(32个1)向右移30位就是0000....11结果就是3.这里是无符号移位,所以补0;上面是有符号移位,补相反方向的最后一位。
    比如-8的二进制码:1111 1000
    向右移3位就是1111 10  在补上前两位11就是1111 11101<<2:
         0000 0001向左移2位就是0000 0100 即如果就是4
      

  11.   

    说一下移位运算
    移位运算是定义在int和long类型上面的,对于int类型,一共占4个字节32位,移位的时候会对移位符号后面的数对32取模,32%32为0,其实没有移位。对于long,共64位,后面的操作数会对64取余 。
      

  12.   

      long 为64位的  float  为32位  转换时候不会损失么?为什么可以自动转换? 
    当然会损失精度
    后面的自己看IEEE754标注就可以了,这个没什么可说的。
      

  13.   

    最讨厌1这种问题了,超级无聊,实在有兴趣自己javap -c 类名 ,看字节码是最直观的了。
      

  14.   

    我说说位运算吧,向左移动n 位,等于除以2的n次方,向右移动n位,等于乘以2的n次方,位运算实现时比用算数运算执行起来要快.