*((unsigned long long*)&(x))>>52 求解释这句话的意思

Zoe_Life 2013-08-04 02:55:58
如题,这句代码不懂,其中x是一个double类型的数,只知道这句话是想将x按位右移52位。求详解,包括long*是干嘛的,&和外面的*是干嘛的,还有为什么不能直接写x>>52,会报错
...全文
259 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2013-08-04
  • 打赏
  • 举报
回复
引用 13 楼 Tkaoru 的回复:
[quote=引用 11 楼 qq120848369 的回复:] [quote=引用 9 楼 Tkaoru 的回复:] [quote=引用 6 楼 qq120848369 的回复:] 用C++来写可以简单的多啊: reinterpret_cast<unsigned long long>(x) >> 52
这句会报错 “reinterpret_cast”无法从“double”转化为“unsigned_int 64”[/quote] 少写了个符号: reinterpret_cast<unsigned long long &>(x) >> 52[/quote] 加上&是什么意思?我试了下reinterpret_cast<unsigned long long>(&x) >> 52也行 难道是取x的地址?[/quote] 就是把&x地址的内存做重新解释, 不加&编译不过呗.
Zoe_Life 2013-08-04
  • 打赏
  • 举报
回复
引用 11 楼 qq120848369 的回复:
[quote=引用 9 楼 Tkaoru 的回复:] [quote=引用 6 楼 qq120848369 的回复:] 用C++来写可以简单的多啊: reinterpret_cast<unsigned long long>(x) >> 52
这句会报错 “reinterpret_cast”无法从“double”转化为“unsigned_int 64”[/quote] 少写了个符号: reinterpret_cast<unsigned long long &>(x) >> 52[/quote] 加上&是什么意思?我试了下reinterpret_cast<unsigned long long>(&x) >> 52也行 难道是取x的地址?
Zoe_Life 2013-08-04
  • 打赏
  • 举报
回复
引用 3 楼 hai200501019 的回复:
&(x)去x的地址,(unsigned long long*)&(x)把x的地址类型转为unsigned long long*。 *((unsigned long long*)&(x))转化之后取x的值 x之前是double,转化为unsigned long long之后,取到的x的值可能跟之前的x的值不一样了。 *((unsigned long long*)&(x))>>52 把取到的unsigned long long 类型的值,也就是x右移52位
很详细 谢谢你
qq120848369 2013-08-04
  • 打赏
  • 举报
回复
引用 9 楼 Tkaoru 的回复:
[quote=引用 6 楼 qq120848369 的回复:] 用C++来写可以简单的多啊: reinterpret_cast<unsigned long long>(x) >> 52
这句会报错 “reinterpret_cast”无法从“double”转化为“unsigned_int 64”[/quote] 少写了个符号: reinterpret_cast<unsigned long long &>(x) >> 52
Zoe_Life 2013-08-04
  • 打赏
  • 举报
回复
引用 8 楼 zhctj159 的回复:
[quote=引用 5 楼 relaxisland 的回复:] 上面基本都说了,补充一下 就是把 double的 位数部分(52字节)移除掉, 得到 符号位 + 指数位 目的是啥就不知道了,为了研究double的构造?
严重同意[/quote] 是为了快速算double数的指数
Zoe_Life 2013-08-04
  • 打赏
  • 举报
回复
引用 6 楼 qq120848369 的回复:
用C++来写可以简单的多啊: reinterpret_cast<unsigned long long>(x) >> 52
这句会报错 “reinterpret_cast”无法从“double”转化为“unsigned_int 64”
zhctj159 2013-08-04
  • 打赏
  • 举报
回复
引用 5 楼 relaxisland 的回复:
上面基本都说了,补充一下 就是把 double的 位数部分(52字节)移除掉, 得到 符号位 + 指数位 目的是啥就不知道了,为了研究double的构造?
严重同意
水平不流 2013-08-04
  • 打赏
  • 举报
回复
移位是整数.
qq120848369 2013-08-04
  • 打赏
  • 举报
回复
用C++来写可以简单的多啊: reinterpret_cast<unsigned long long>(x) >> 52
relaxisland 2013-08-04
  • 打赏
  • 举报
回复
上面基本都说了,补充一下 就是把 double的 位数部分(52字节)移除掉, 得到 符号位 + 指数位 目的是啥就不知道了,为了研究double的构造?
FancyMouse 2013-08-04
  • 打赏
  • 举报
回复
52。x的类型猜测是double。
海的神话 2013-08-04
  • 打赏
  • 举报
回复
&(x)去x的地址,(unsigned long long*)&(x)把x的地址类型转为unsigned long long*。 *((unsigned long long*)&(x))转化之后取x的值 x之前是double,转化为unsigned long long之后,取到的x的值可能跟之前的x的值不一样了。 *((unsigned long long*)&(x))>>52 把取到的unsigned long long 类型的值,也就是x右移52位
zybjtu 2013-08-04
  • 打赏
  • 举报
回复
引用 楼主 Tkaoru 的回复:
如题,这句代码不懂,其中x是一个double类型的数,只知道这句话是想将x按位右移52位。求详解,包括long*是干嘛的,&和外面的*是干嘛的,还有为什么不能直接写x>>52,会报错
移位操作局限于整数,直接移位当然有问题。转化为unsigned long long类型是因为double表示的范围大。这样的移位舍弃了小数部分的
max_min_ 2013-08-04
  • 打赏
  • 举报
回复


应该是内存映射机制吧!

http://www.360doc.com/content/11/1019/08/1317564_157333511.shtml

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧