在C ++中进行内联汇编以进行数据转换

光头

我正在尝试编写C ++代码以将程序集转换dq 3FA999999999999Ah为C ++ doubleasm内键入什么我不知道该如何取值。

int main()
{
    double x;

    asm
    {
        dq  3FA999999999999Ah
        mov x,?????
    }

    std::cout<<x<<std::endl;

    return 0;
}
梭子87

从评论看来,您似乎很想在这里使用重新解释演员表从本质上讲,这是要告诉编译器将位序列当作是强制类型转换的,但不会进行任何转换值的尝试。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用C进行内联汇编

来自分类Dev

如何在C中进行数据对齐?

来自分类Dev

在C中进行除法转换

来自分类Dev

在C ++中进行内存清理的更好方法可以消除数据泄漏?

来自分类Dev

在C ++中进行内存清理的更好方法是使数据泄漏无效?

来自分类Dev

在C ++中进行多继承转换

来自分类Dev

在C ++中进行多继承转换

来自分类Dev

如何在每个行数组中进行颜色更改C ++

来自分类Dev

如何在每个行数组中进行颜色更改C ++

来自分类Dev

在TDS中进行内联编辑

来自分类Dev

如何将 32 位字符与 32 位字符进行比较,内联汇编 C++

来自分类Dev

在C#中进行投放与转换的适当时间

来自分类Dev

杂项函数在C中进行隐式转换?

来自分类Dev

在 C++ 中进行类型转换的简短而优雅的方法?

来自分类Dev

使用复杂/嵌套对象(C#)进行数据绑定

来自分类Dev

如何通过C#而不是WPF进行数据绑定?

来自分类Dev

使用C#Dynamic轻松进行数据访问

来自分类Dev

在 C# 中进行 mysqldump 备份不会检索数据

来自分类Dev

在NDK中进行arm内联汇编,如何处理指针和指向的数据?

来自分类Dev

在NDK中进行arm内联汇编,如何处理指针和指向的数据?

来自分类Dev

如何在snort规则文件中进行内联注释?

来自分类Dev

使用编辑按钮jQuery在表中进行内联编辑

来自分类Dev

在C程序中进行校准

来自分类Dev

在C ++中进行数学运算时,浮点错误如何传播?

来自分类Dev

在C中进行数组初始化会导致访问冲突

来自分类Dev

用C ++进行内存管理?

来自分类Dev

如何将AVR GCC风格的C内联汇编转换为Rust内联汇编?

来自分类Dev

使用代码进行C#符号汇编

来自分类Dev

DES在C / C ++与Java中进行加密

Related 相关文章

热门标签

归档