C/C++中字節序、類型轉化的深刻理解

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