大小端,memcpy和構造函數


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM