若是將字節序、類型轉化單獨一個拿出來講時,你們可能都以爲很簡單,可是理解的不深刻。若是將其結合起來探討,可能咱們就會理解的很透徹。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; }