问题:memcpy一段内存到std::bitset里,bitset里的内存数据和被拷贝的内存数据对应不上
代码如下:
#include <iostream> #include <bitset> using namespace std; int main() { char a[5] = { 0x00,0x03,0x03,0x04,0x05 }; std::bitset<16> tBitset; memcpy(&tBitset, a, 2); std::bitset<16> t2Bitset(3); int n = sizeof(unsigned long); system("pause"); return 0; }
此时我的预期是:tBitset={0x0003}
而实际调试结果如下:
tBitset={0x00C0}
最终不断调试得到原因:
memcpy拷贝传入的参数是char*,一个一个字节拷贝,当我们把tBitset的地址传进去拷贝的时候,做了这么几件事情:
1、将a数组的第一第二2个字节的数据拷贝到tBitset里面
2、char数据隐式转换为unsigned long
3、使用构造函数bitset (unsigned long val);对tBitset构造
具体调试截图如下:
可以看到我们只copy了2个字节可是有4个字节的数据,因为char*转为unsinged long(32位机4字节)
- 大端模式:数字逻辑高位存储在内存的物理低位
- 小端模式:数字逻辑低位存储在内存的物理低位
我是小端模式,所以这个 unsigned long 的数据为 00 00 03 00,2^8+2^9=768;转化为16进制是0x300;tBitset是0000 0011 0000 0000;和调试结果截图对应
然而为了测试unsigned long 构造出来的bitset是怎么样的,我用std::bitset<16> t2Bitset(3);16进制是0x3;二进制11 看到内存结果截图为
因此右边第一位是数组第0位
之所以刚开始的预期错误,是因为误以为,传入A地址memcpy,就以为A的内存和被拷贝的内存完全一致,A的数组某一位和内存某一位对应,这种想法是错误的,其实A的数组某一位是由A的构造函数决定的,当我把同一块内存的数据分别以unsigned long 和 string类型作参数传进构造函数去,A数组的同一位值可能就不一样,切记