• 大小端,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数组的同一位值可能就不一样,切记

  • 相关阅读:
    100 道 Linux 常见面试题
    借助Redis锁,完美解决高并发秒杀问题
    'cnpm'安装install
    Git常用命令及方法大全
    idea controller service impl mapper xml切换跳转快捷键
    idea创建springboot项目用阿里云镜像
    mybatis.type-aliases-package的作用和用法
    MyBatis Generator
    https://antdv.com/components/layout-cn/
    https://mvnrepository.com/search?q=mysql-connector-java //maven
  • 原文地址:https://www.cnblogs.com/likemao/p/8688330.html
Copyright © 2020-2023  润新知