关于Java的基础小问题

时间:2021-11-07 14:18:09
初学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   中  浮点型数据  究竟怎么样定义表示的?物理结构怎么划分的。






    多多指教啦!回答任意问题 我都会酌情发分的   谢谢啦!!!

24 个解决方案

#1


dingding

#2


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!

#3


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=10

Int 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=0

2.用于位运算。包括有符号和无符号数的移位运算操作。
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升的瓶中不会出现任何问题!这个例子你应该能明白转型的问题了吧?

#4


受教了

#5


mark

#6


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



3#!!!

#7


引用楼主 cc5022131 的帖子:
  3.关于java  中可以实现高级数据类型向低级的自动转换 
        byte->short->int->long->float->double
        long 为64位的  float  为32位  转换时候不会损失么?为什么可以自动转换?


		  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位用来表示精度了)

#8


第三题想补充下,呵呵,各位大侠看说的对不对。

java中有三种自动类型转换会造成数据的丢失:
1.int->float
2.long->float
3.long->double

原因是因为,实型的数据最后一个字节是用来存储位权的,也就是科学计数法里边的10的多少次方,存储在这个字节里边,比如说int想要转换成float,那么int的4个字节的数值,会相应的存储到float除开位权那一个字节的前3个字节中,也就是说4个字节存入3个字节,自然会产生数据的丢失,相应的float中的第4个字节中这个时候存储的数就会是0。

后边2种情况依次类推也不难解释了,不知道说得对不对,请指教。

#9


1. 看2楼: 基本是这样子(除了第一个10应该为a)

2. 看3楼:补充就是,移位的话都是对要移的位数按长度取模之后再移的。
意思是说, 3<<2,3<<34,3<<-32最终的值是一样的

#10


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 


哪个对呀

#11


顶!

#12


顶!

#13


引用 10 楼 chend* 的回复:
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 


哪个对呀

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

#14


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

#15


第一题上面说的很简单了,还是把第二题说说:
>>,<<都是有符号移位运算符,比如-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 1110

1<<2:
     0000 0001向左移2位就是0000 0100 即如果就是4

#16


#17


3题弄懂了,1,2题  还是不明白啊  好多大侠明显没看清楚题 啊   再拜托各位啦

#18


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

#19


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

#20


哈哈  第2个  我也明白了  感谢各位大侠!   就剩第一题啦   !  大家加油拉 谢谢了 

#21


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

#22


感谢楼上啊 ,可惜我看不懂啊,作为一个初学者 ,我只想通过程序弄明白一些混淆的概念,其实也并非咬文嚼字,大家不要拍我板砖啊   谢谢了

#23


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

#24


支持

#1


dingding

#2


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!

#3


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=10

Int 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=0

2.用于位运算。包括有符号和无符号数的移位运算操作。
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升的瓶中不会出现任何问题!这个例子你应该能明白转型的问题了吧?

#4


受教了

#5


mark

#6


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



3#!!!

#7


引用楼主 cc5022131 的帖子:
  3.关于java  中可以实现高级数据类型向低级的自动转换 
        byte->short->int->long->float->double
        long 为64位的  float  为32位  转换时候不会损失么?为什么可以自动转换?


		  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位用来表示精度了)

#8


第三题想补充下,呵呵,各位大侠看说的对不对。

java中有三种自动类型转换会造成数据的丢失:
1.int->float
2.long->float
3.long->double

原因是因为,实型的数据最后一个字节是用来存储位权的,也就是科学计数法里边的10的多少次方,存储在这个字节里边,比如说int想要转换成float,那么int的4个字节的数值,会相应的存储到float除开位权那一个字节的前3个字节中,也就是说4个字节存入3个字节,自然会产生数据的丢失,相应的float中的第4个字节中这个时候存储的数就会是0。

后边2种情况依次类推也不难解释了,不知道说得对不对,请指教。

#9


1. 看2楼: 基本是这样子(除了第一个10应该为a)

2. 看3楼:补充就是,移位的话都是对要移的位数按长度取模之后再移的。
意思是说, 3<<2,3<<34,3<<-32最终的值是一样的

#10


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 


哪个对呀

#11


顶!

#12


顶!

#13


引用 10 楼 chend* 的回复:
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 


哪个对呀

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

#14


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

#15


第一题上面说的很简单了,还是把第二题说说:
>>,<<都是有符号移位运算符,比如-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 1110

1<<2:
     0000 0001向左移2位就是0000 0100 即如果就是4

#16


#17


3题弄懂了,1,2题  还是不明白啊  好多大侠明显没看清楚题 啊   再拜托各位啦

#18


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

#19


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

#20


哈哈  第2个  我也明白了  感谢各位大侠!   就剩第一题啦   !  大家加油拉 谢谢了 

#21


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

#22


感谢楼上啊 ,可惜我看不懂啊,作为一个初学者 ,我只想通过程序弄明白一些混淆的概念,其实也并非咬文嚼字,大家不要拍我板砖啊   谢谢了

#23


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

#24


支持