zoukankan      html  css  js  c++  java
  • 大小端,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数组的同一位值可能就不一样,切记

  • 相关阅读:
    数据库索引的作用和长处缺点
    iOS安全攻防(三):使用Reveal分析他人app
    SVN server的搭建
    腾讯2014年实习生招聘笔试面试经历
    JAVA数组的定义及用法
    一年成为Emacs高手(像神一样使用编辑器)
    给想上MIT的牛学生说几句
    四个好看的CSS样式表格
    dede 留言簿 多个
    破解中国电信华为无线猫路由(HG522-C)自己主动拨号+不限电脑数+iTV
  • 原文地址:https://www.cnblogs.com/likemao/p/8688330.html
Copyright © 2011-2022 走看看