我正在尝试编写C ++代码以将程序集转换dq 3FA999999999999Ah
为C ++ double
。在asm
块内键入什么?我不知道该如何取值。
int main()
{
double x;
asm
{
dq 3FA999999999999Ah
mov x,?????
}
std::cout<<x<<std::endl;
return 0;
}
从评论看来,您似乎很想在这里使用重新解释演员表。从本质上讲,这是要告诉编译器将位序列当作是强制类型转换的,但不会进行任何转换值的尝试。
uint64_t raw = 0x3FA999999999999A;
double x = reinterpret_cast<double&>(raw);
此处请参见以下操作:http : //coliru.stacked-crooked.com/a/37aec366eabf1da7
请注意,我在这里使用了特定的64位整数类型,以确保所需的位表示与64位double的位表示匹配。另外,double&
由于C ++规则禁止将强制类型转换为,因此强制类型转换也必须使用double
。这是因为reinterpret cast处理内存而不是类型转换,有关更多详细信息,请参见以下问题:为什么reinterpret_cast无法编译?。另外,您需要确保此处未签名的64位表示形式将与double的位重新解释匹配,以使其正常工作。
编辑:值得注意的是,编译器警告此违反严格的别名规则。快速总结是,现在有多个值引用了内存中的同一位置,如果更改是通过另一种可访问的方式发生的,则编译器可能无法判断更改了哪些变量。通常,您不想忽略这一点,我强烈建议您阅读以下有关严格别名的文章,以了解为什么这是一个问题。因此,虽然代码的意图可能不太清楚,但您可能会发现更好的解决方案是使用memcpy来避免别名问题:
#include <iostream>
int main()
{
double x;
const uint64_t raw = 0x3FA999999999999A;
std::memcpy(&x, &raw, sizeof raw);
std::cout<<x<<std::endl;
return 0;
}
请在此处实际操作:http : //coliru.stacked-crooked.com/a/5b738874e83e896a
这样就避免了混叠问题,因为x
现在是具有正确组成位的double,但是由于memcpy
使用原因,它与用于表示创建它所需的位模式的原始64位int不在同一存储位置。因为memcpy
将变量当作数组来对待,所以char
您仍然需要确保正确地选择了字节序注意事项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句