ホームページ  >  記事  >  バックエンド開発  >  C/C++ のエンディアンと型変換についての深い理解

C/C++ のエンディアンと型変換についての深い理解

高洛峰
高洛峰オリジナル
2016-11-17 13:12:362115ブラウズ

バイトオーダーと型変換を分けて話すと、誰もがとても簡単だと思うかもしれませんが、深く理解することはできません。それらを組み合わせて議論すれば、より深く理解できるかもしれません。

バイトオーダーと型変換の基本が理解できない場合は、次のブログを参照してください:

https://my.oschina.net/u/1783725/blog/647973 ラージバイトオーダーとスモールバイトオーダー

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

本題に入る前に、簡単な一文:

異なるシステム数字は、データ型の異なるバイトサイズに対応します

C/C++ のエンディアンと型変換についての深い理解

詳細 2 つの関係を紹介します

バイト オーダー: 操作のメモリは、メモリに表示されるデータを保存するための規則です。

ビッグ エンディアン: ビッグ エンディアンが有効、上位データが最初に下位アドレスのメモリに配置され、下位データが上位アドレスのメモリに配置されます。リトル エンディアン: リトル エンディアンが有効、下位データは最初に低アドレスのメモリに配置され、次に上位のデータが配置されます 上位アドレスのメモリに入力するとき

メモリを操作するとき (例: memcpy)、バイトオーダーを考慮する必要があります

C/C++ のエンディアンと型変換についての深い理解

型変換: 操作バイト変換サイズの種類に応じて、メモリから読み取られるデータであるデータを読み取ることです。

桁数が多いものは桁数の少ないものに変換(位置データを残して上位桁が切り捨てられます)、桁数が少ないものは桁数が多いものに変換されます(上位桁データは切り捨てられます) 0で埋めてください)。

C/C++ のエンディアンと型変換についての深い理解

それらを理解するための例

1. メモリ(memcpy)を操作する場合、割り当てはバイトオーダーを考慮する必要があります

1: unsigned long long型の0xABCDEF1234をunsigned longに割り当てます。 type 変数、バイトオーダーとは関係ありません

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 までご連絡ください。