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