ホームページ >バックエンド開発 >C#.Net チュートリアル >C/C++ のエンディアンと型変換についての深い理解
バイトオーダーと型変換を分けて話すと、誰もがとても簡単だと思うかもしれませんが、深く理解することはできません。それらを組み合わせて議論すれば、より深く理解できるかもしれません。
バイトオーダーと型変換の基本が理解できない場合は、次のブログを参照してください:
https://my.oschina.net/u/1783725/blog/647973 ラージバイトオーダーとスモールバイトオーダー
https://my.oschina.net/u/1783725/blog/700970 型変換
本題に入る前に、簡単な一文:
異なるシステム数字は、データ型の異なるバイトサイズに対応します
詳細 2 つの関係を紹介します
バイト オーダー: 操作のメモリは、メモリに表示されるデータを保存するための規則です。
ビッグ エンディアン: ビッグ エンディアンが有効、上位データが最初に下位アドレスのメモリに配置され、下位データが上位アドレスのメモリに配置されます。リトル エンディアン: リトル エンディアンが有効、下位データは最初に低アドレスのメモリに配置され、次に上位のデータが配置されます 上位アドレスのメモリに入力するとき
メモリを操作するとき (例: memcpy)、バイトオーダーを考慮する必要があります
型変換: 操作バイト変換サイズの種類に応じて、メモリから読み取られるデータであるデータを読み取ることです。
桁数が多いものは桁数の少ないものに変換(位置データを残して上位桁が切り捨てられます)、桁数が少ないものは桁数が多いものに変換されます(上位桁データは切り捨てられます) 0で埋めてください)。
それらを理解するための例
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; }