如果將位元組序、類型轉化單獨一個拿出來說時,大家可能都覺得很簡單,但是理解的不深入。如果將其結合起來探討,可能我們就會理解的很透徹。
關於位元組序和類型轉化的基礎,大家如果不太理解,可以參考以下部落格:
https://my.oschina.net/u/1783725/blog/647973 大小位元組序
https://my.oschina.net/u/1783725/blog/700970 類型轉化
在進入正題之前,在囉嗦一句:
系統位元不同對應資料類型的位元組數大小也不同
詳細介紹兩者之間的聯絡
位元組序: 操作的記憶體,就是將我們看到的資料存放在記憶體中的規則。
大位元組序:大端有效 ,高位元據先放入低地址記憶體 , 低位元據放入高地址記憶體;小位元組序:小端有效,低位元據先放入低地址記憶體 , 高位元據再放入高地址記憶體
操作記憶體(如:memcpy)就需要考慮位元組序
類型轉化: 操作的是讀出的資料,就是將從記憶體中讀取的資料,根據類型位元組的大小進行轉化。
位元多的轉化為位元小的(會截斷高位的資料,留下地位的資料),位元小的轉化為位元多的(將高位的資料補為0)。
一個例子來讀懂他們
1、賦值與位元組序無關,操作記憶體(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=abcd1234return 0;}