You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何memcpy产生非预期值?如何使tx1等于0xFFFF0000FFFF0000?

问题原因与解决方案

问题根源

你代码里的double tx = 0xFFFF0000FFFF0000;是错误核心:编译器会把0xFFFF0000FFFF0000当作64位整数,然后将其转换为IEEE 754标准的double类型浮点数。这个转换过程会彻底改变原数的二进制位结构,所以后续通过memcpy得到的tx1是浮点数的二进制表示,而非你预期的原十六进制值的二进制位。

解决方法

方法一:直接操作整数类型(最简洁)

跳过double中转,直接将十六进制值赋值给uint64_t,再初始化bitset:

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    uint64_t tx1 = 0xFFFF0000FFFF0000;
    bitset<64> b1(tx1);
    
    cout << b1 << endl;
    
    return 0;
}

方法二:使用联合体共享内存(若需兼容double场景)

如果必须通过double变量传递数据,可以用联合体让整数和浮点数共享同一块内存,直接写入整数的二进制位:

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    union {
        uint64_t int_val;
        double float_val;
    } u;
    u.int_val = 0xFFFF0000FFFF0000; // 直接写入整数二进制位
    bitset<64> b1(u.int_val);
    
    cout << b1 << endl;
    
    return 0;
}

方法三:直接用二进制字符串初始化bitset

将十六进制0xFFFF0000FFFF0000转换为64位二进制字符串,直接初始化bitset:

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    // 0xFFFF0000FFFF0000对应的二进制字符串
    bitset<64> b1("1111111111111111000000000000000011111111111111110000000000000000");
    cout << b1 << endl;
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Handrix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:14:52