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