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

时间:2021-09-07 17:06:04
    如题,这句代码不懂,其中x是一个double类型的数,只知道这句话是想将x按位右移52位。求详解,包括long*是干嘛的,&和外面的*是干嘛的,还有为什么不能直接写x>>52,会报错

14 个解决方案

#1




应该是内存映射机制吧!

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

#2


引用 楼主 Tkaoru 的回复:
    如题,这句代码不懂,其中x是一个double类型的数,只知道这句话是想将x按位右移52位。求详解,包括long*是干嘛的,&和外面的*是干嘛的,还有为什么不能直接写x>>52,会报错

移位操作局限于整数,直接移位当然有问题。转化为unsigned long long类型是因为double表示的范围大。这样的移位舍弃了小数部分的

#3


&(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位

#4


52。x的类型猜测是double。

#5


上面基本都说了,补充一下

就是把 double的 位数部分(52字节)移除掉,
得到 符号位 +  指数位

目的是啥就不知道了,为了研究double的构造?

#6


用C++来写可以简单的多啊:

reinterpret_cast<unsigned long long>(x) >> 52

#7


移位是整数.

#8


引用 5 楼 relaxisland 的回复:
上面基本都说了,补充一下

就是把 double的 位数部分(52字节)移除掉,
得到 符号位 +  指数位

目的是啥就不知道了,为了研究double的构造?
严重同意

#9


引用 6 楼 qq120848369 的回复:
用C++来写可以简单的多啊:

reinterpret_cast<unsigned long long>(x) >> 52

这句会报错 “reinterpret_cast”无法从“double”转化为“unsigned_int 64”

#10


引用 8 楼 zhctj159 的回复:
Quote: 引用 5 楼 relaxisland 的回复:

上面基本都说了,补充一下

就是把 double的 位数部分(52字节)移除掉,
得到 符号位 +  指数位

目的是啥就不知道了,为了研究double的构造?
严重同意

是为了快速算double数的指数 

#11


引用 9 楼 Tkaoru 的回复:
Quote: 引用 6 楼 qq120848369 的回复:

用C++来写可以简单的多啊:

reinterpret_cast<unsigned long long>(x) >> 52

这句会报错 “reinterpret_cast”无法从“double”转化为“unsigned_int 64”


少写了个符号:
reinterpret_cast<unsigned long long &>(x) >> 52

#12


引用 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位

很详细 谢谢你

#13


引用 11 楼 qq120848369 的回复:
Quote: 引用 9 楼 Tkaoru 的回复:

Quote: 引用 6 楼 qq120848369 的回复:

用C++来写可以简单的多啊:

reinterpret_cast<unsigned long long>(x) >> 52

这句会报错 “reinterpret_cast”无法从“double”转化为“unsigned_int 64”


少写了个符号:
reinterpret_cast<unsigned long long &>(x) >> 52

加上&是什么意思?我试了下reinterpret_cast<unsigned long long>(&x) >> 52也行 难道是取x的地址?

#14


引用 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”


少写了个符号:
reinterpret_cast<unsigned long long &>(x) >> 52

加上&是什么意思?我试了下reinterpret_cast<unsigned long long>(&x) >> 52也行 难道是取x的地址?


就是把&x地址的内存做重新解释, 不加&编译不过呗.

#1




应该是内存映射机制吧!

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

#2


引用 楼主 Tkaoru 的回复:
    如题,这句代码不懂,其中x是一个double类型的数,只知道这句话是想将x按位右移52位。求详解,包括long*是干嘛的,&和外面的*是干嘛的,还有为什么不能直接写x>>52,会报错

移位操作局限于整数,直接移位当然有问题。转化为unsigned long long类型是因为double表示的范围大。这样的移位舍弃了小数部分的

#3


&(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位

#4


52。x的类型猜测是double。

#5


上面基本都说了,补充一下

就是把 double的 位数部分(52字节)移除掉,
得到 符号位 +  指数位

目的是啥就不知道了,为了研究double的构造?

#6


用C++来写可以简单的多啊:

reinterpret_cast<unsigned long long>(x) >> 52

#7


移位是整数.

#8


引用 5 楼 relaxisland 的回复:
上面基本都说了,补充一下

就是把 double的 位数部分(52字节)移除掉,
得到 符号位 +  指数位

目的是啥就不知道了,为了研究double的构造?
严重同意

#9


引用 6 楼 qq120848369 的回复:
用C++来写可以简单的多啊:

reinterpret_cast<unsigned long long>(x) >> 52

这句会报错 “reinterpret_cast”无法从“double”转化为“unsigned_int 64”

#10


引用 8 楼 zhctj159 的回复:
Quote: 引用 5 楼 relaxisland 的回复:

上面基本都说了,补充一下

就是把 double的 位数部分(52字节)移除掉,
得到 符号位 +  指数位

目的是啥就不知道了,为了研究double的构造?
严重同意

是为了快速算double数的指数 

#11


引用 9 楼 Tkaoru 的回复:
Quote: 引用 6 楼 qq120848369 的回复:

用C++来写可以简单的多啊:

reinterpret_cast<unsigned long long>(x) >> 52

这句会报错 “reinterpret_cast”无法从“double”转化为“unsigned_int 64”


少写了个符号:
reinterpret_cast<unsigned long long &>(x) >> 52

#12


引用 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位

很详细 谢谢你

#13


引用 11 楼 qq120848369 的回复:
Quote: 引用 9 楼 Tkaoru 的回复:

Quote: 引用 6 楼 qq120848369 的回复:

用C++来写可以简单的多啊:

reinterpret_cast<unsigned long long>(x) >> 52

这句会报错 “reinterpret_cast”无法从“double”转化为“unsigned_int 64”


少写了个符号:
reinterpret_cast<unsigned long long &>(x) >> 52

加上&是什么意思?我试了下reinterpret_cast<unsigned long long>(&x) >> 52也行 难道是取x的地址?

#14


引用 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”


少写了个符号:
reinterpret_cast<unsigned long long &>(x) >> 52

加上&是什么意思?我试了下reinterpret_cast<unsigned long long>(&x) >> 52也行 难道是取x的地址?


就是把&x地址的内存做重新解释, 不加&编译不过呗.