关于不同类型之间使用memcpy

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

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


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

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

 

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

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:后面有空再学习下字节序的内容,然后帖出来分享和记录一下




你可能感兴趣的:(C+)