关于不同类型之间使用memcpy

我们知道,memcpy的原型大概是这样的:

void memcpy(void*,const void *,size_t);


也就是说,相对strcpy,memcpy的可用的场合更多,至少从声明来看,可以支持任意类型之间的拷贝

 之前遇到的类似这样的代码:  //为了简化说明,数字比较简单

 

unsigned long ulVar = 0;
    
memcpy(<char*>(&ulVar),"00000001",8);
    
cout<<"--"<<ulVar<<endl;   

unsigned long占8个字节(64位),字符串“00000001”,每位占用1个字节,8个字符也占用64位,memcpy拷贝8个字节到unsigned long,长度刚刚好

我当时的想法是,前面的7个0拷贝到unsigned long的前7位,最后一个1拷贝到unsigned long的最后一个,最终的结果应该是1

但是实际执行的结果却是:3544385890265608240


这样理解明显是有点错误的,首先,字符'0'拷贝到unsigned long后,并非也是0,也应该是‘0’的ASCII码,查询后得知‘0’的ASCII码为48,即0x00110000


按照这样,如果不考虑大小端的问题,前7个'0'和后一个'1',拷贝过去,应该可以得到这样的一个二进制串:0011000000110000001100000011000000110000001100000011000000110001

使用bc计算一下,可以得到值:

yixiao@yixiao-p6-1319cx:~$ echo "ibase=2;0011000000110000001100000011000000110000001100000011000000110001" | bc
3472328296227680305
得到的值为:3472328296227680305,和执行结果仍然不一致!


再进一步,如果考虑字节序,反转一下("10000000"),则可得到二进制序列:0011000100110000001100000011000000110000001100000011000000110000

bc计算一下:

yixiao@yixiao-p6-1319cx:~$ echo "ibase=2;0011000100110000001100000011000000110000001100000011000000110000" | bc
3544385890265608240
得到的值为:3544385890265608240,就和执行结果一致了


//ps:后面有空再学习下字节序的内容,然后帖出来分享和记录一下




  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值