首頁  >  文章  >  後端開發  >  C/C++中字節序、型別轉換的深入理解

C/C++中字節序、型別轉換的深入理解

高洛峰
高洛峰原創
2016-11-17 13:12:362234瀏覽

 如果將字節序、類型轉換單獨一個拿出來說時,大家可能都覺得很簡單,但是理解的不深入。如果將其結合起來探討,可能我們就會理解的很透徹。

關於字節序和類型轉換的基礎,大家如果不太理解,可以參考以下部落格:

https://my.oschina.net/u/1783725/blog/647973  大小字節序

https: //my.oschina.net/u/1783725/blog/700970  類型轉換

在進入正題之前,在囉嗦介紹兩者之間的聯繫

字節序: 操作的內存,就是將我們看到的資料存放在內存中的規則。

    大字節序:大端有效,高位元資料先放入低位址內存 , 低位元資料放入高位址記憶體;小位元組序:小端有效,低位元資料先放入低位址內存,高位元資料再放置入高位址記憶體C/C++中字節序、型別轉換的深入理解

    操作記憶體(如:memcpy)就需要考慮字節序

類型轉換: 操作的是讀出的數據,就是將從記憶體中讀取的數據,根據型別字節的大小進行轉換。

位數多的轉換為位數小的(會截斷高位的數據,留下地位的數據),位數小的轉換為位數多的(將高位的數據補為0)。

C/C++中字節序、型別轉換的深入理解

一個例子來讀懂他們

1、賦值與字節序列無關,操作記憶體(memcpy)就需要考慮字節序

1:將類型的0xABCoedlongsignm 相賦值賦值給類型的0xABCD1234變量,與字節序列無關C/C++中字節序、型別轉換的深入理解

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;
}

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn