黑马程序员技术交流社区

标题: 关于移位运算符的疑问。 [打印本页]

作者: 寐海流风    时间: 2014-6-11 21:41
标题: 关于移位运算符的疑问。
本帖最后由 寐海流风 于 2014-6-21 15:01 编辑

关于移位运算符遇到的问题:
1、double lo = 39.2>>4;
2、int i = 4>>32;int m = 4>>33;int n = 4>>34;

在1条目中,为什么编译不能通过?既然一个double类型的数值是8字节的,也就是64位,为什么不能移位呢?浮点数是怎么存储的呢?
在2条目中,为什么打印结果分别为i=4、2、1?既然一个int类型的数值是4字节的,也就是32位,打印结果却不怎么好理解。(怎么感觉当移位超过31位后,又重新给个4继续移位呢?也就是说移位32其实是移位(32-32);移位33其实是移位(33-32);移位34是移位(34-32)。)——但是我用“>>>”来操作,也是同样结果呢?

作者: 寐海流风    时间: 2014-6-12 11:13
昨天又查了一些资料,还是没完全明白。
作者: axuan    时间: 2014-6-12 11:53
最大的问题:
计算机处理的01二进制,01二进制只能表示整数,浮点数怎么可以呢
作者: 寐海流风    时间: 2014-6-12 13:41
axuan 发表于 2014-6-12 11:53
最大的问题:
计算机处理的01二进制,01二进制只能表示整数,浮点数怎么可以呢 ...

查阅资料,自己理解是这样的:
double lo = 39.2;
整数部分39的二进制:100111
小数部分0.2的二进制:0011-0011-0011(就是0011循环,但是不知道循环到什么时候,难道是加上前面以消耗的位数,再表示完64位?;这里姑且取12位(int e = 12;))
那么39.2先表示成100111.001100110011
那么转换成10进制就是:100111001100110011*(2^e)

—————————
但是自己还是有些疑问。共同学习
作者: axuan    时间: 2014-6-12 15:00
寐海流风 发表于 2014-6-12 13:41
查阅资料,自己理解是这样的:
double lo = 39.2;
整数部分39的二进制:100111

这个有点底层,不学了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2