問題: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數組的同一位值可能就不一樣,切記