为何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
相关产品推荐
相关产品推荐

