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!
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升的瓶中不会出现任何问题!这个例子你应该能明白转型的问题了吧?
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#!!!
3#!!!
#7
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种情况依次类推也不难解释了,不知道说得对不对,请指教。
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最终的值是一样的
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
哪个对呀
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
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
>>,<<都是有符号移位运算符,比如-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取余 。
移位运算是定义在int和long类型上面的,对于int类型,一共占4个字节32位,移位的时候会对移位符号后面的数对32取模,32%32为0,其实没有移位。对于long,共64位,后面的操作数会对64取余 。
#19
long 为64位的 float 为32位 转换时候不会损失么?为什么可以自动转换?
当然会损失精度
后面的自己看IEEE754标注就可以了,这个没什么可说的。
当然会损失精度
后面的自己看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!
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升的瓶中不会出现任何问题!这个例子你应该能明白转型的问题了吧?
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#!!!
3#!!!
#7
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种情况依次类推也不难解释了,不知道说得对不对,请指教。
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最终的值是一样的
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
哪个对呀
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
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
>>,<<都是有符号移位运算符,比如-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取余 。
移位运算是定义在int和long类型上面的,对于int类型,一共占4个字节32位,移位的时候会对移位符号后面的数对32取模,32%32为0,其实没有移位。对于long,共64位,后面的操作数会对64取余 。
#19
long 为64位的 float 为32位 转换时候不会损失么?为什么可以自动转换?
当然会损失精度
后面的自己看IEEE754标注就可以了,这个没什么可说的。
当然会损失精度
后面的自己看IEEE754标注就可以了,这个没什么可说的。
#20
哈哈 第2个 我也明白了 感谢各位大侠! 就剩第一题啦 ! 大家加油拉 谢谢了
#21
最讨厌1这种问题了,超级无聊,实在有兴趣自己javap -c 类名 ,看字节码是最直观的了。
#22
感谢楼上啊 ,可惜我看不懂啊,作为一个初学者 ,我只想通过程序弄明白一些混淆的概念,其实也并非咬文嚼字,大家不要拍我板砖啊 谢谢了
#23
我说说位运算吧,向左移动n 位,等于除以2的n次方,向右移动n位,等于乘以2的n次方,位运算实现时比用算数运算执行起来要快.
#24
支持