若是将字节序、类型转化单独一个拿出来讲时,你们可能都以为很简单,可是理解的不深刻。若是将其结合起来探讨,可能咱们就会理解的很透彻。spa
关于字节序和类型转化的基础,你们若是不太理解,能够参考如下博客:.net
http://www.javashuo.com/article/p-gerzxxui-gn.html 大小字节序code
http://www.javashuo.com/article/p-wfkaaakf-gp.html 类型转化blog
在进入正题以前,在啰嗦一句:内存
系统位数不一样对应数据类型的字节数大小也不一样ci
系统位数 | int | unsigned long | unsigned long long |
32位 | 4字节 | 4字节 | 8字节 |
64位 | 8字节 | 8字节 | 8字节 |
字节序: 操做的内存,就是将咱们看到的数据存放在内存中的规则。get
大字节序:大端有效 ,高位数据先放入低地址内存 , 低位数据放入高地址内存;小字节序:小端有效,低位数据先放入低地址内存 , 高位数据再放入高地址内存博客
操做内存(如:memcpy)就须要考虑字节序io
类型转化: 操做的是读出的数据,就是将从内存中读取的数据,根据类型字节的大小进行转化。table
位数多的转化为位数小的(会截断高位的数据,留下地位的数据),位数小的转化为位数多的(将高位的数据补为0)。
一、赋值与字节序无关,操做内存(memcpy)就须要考虑字节序
1:将unsigned long long类型的0xABCDEF1234赋值给unsigned long类型的变量,与字节序无关
2:unsigned long long类型的0xABCDEF1234变量使用memcpy到short类型的变量,发现为0,与字节序有关
代码以下:
#include <stdio.h> int main(int argc, char *argv[]) { unsigned long long ullVar = 0xABCD1234; unsigned long ulVar1 = 0; unsigned long ulVar2 = 0; /*memcpy操做内存时,须要考虑系统的大小字节序,若是是大字节序的话,高位的数据保存在低地址上*/ memcpy(&ulVar1,&ullVar,sizeof(ulVar1)); /*赋值时,就是讲读出的数据按照要赋值的数据类型的大小进行转换*/ ulVar2 = ullVar; printf("ulVar1=%x ulVar2=%x \n",ulVar1,ulVar2); //输出:ulVar1=0 ulVar2=abcd1234 return 0; }