序文
以下に示すように、まず質問を通じてビッグ エンディアンとリトル エンディアンの概念を紹介しましょう。
ビッグエンディアンとリトルエンディアンの概念を簡単に説明し、現在のマシンのバイト順序を決定する小さなプログラムを設計してください。
1. ビッグエンディアンとリトルエンディアンの概念。
ビッグエンディアン (ストレージ) モードは、データの下位ビットがメモリの上位アドレスに格納され、データの上位ビットがメモリの下位アドレスに格納されることを意味します。リトルエンディアン (ストレージ) ) モードは、データの下位ビットがメモリの下位アドレスに格納され
、
データの上位ビットが
メモリの上位アドレスに格納されることを意味します。
1. ビッグエンディアンとリトルエンディアンの詳細説明
データがコンピューターに保存される方法は 2 の補数コードの形式であることはわかっています。(補数コードがわからない場合は、この記事のビット演算子の概要を読んでください。) たとえば、整数データ 2 は、
0000 0000 0000 0000 0000 0000 0000 0010の形式でメモリに保存されます。 2 の補数コードを 10 に変換します。16 進数は00 00 00 02
です。しかし、VS 2022 環境でデバッグすると、メモリに格納されている数値 2 の 16 進数が次のとおりであることがわかりました
。数字の 2 は、メモリ内の記憶形式は02 00 00 00であることがわかります。これは、上で計算した00 00 00 02 とはまったく逆の順序ですが、すべてのビットが20のように逆の形式になっているわけではありません。 00 00 00。これは、メモリ内ではデータが全体としてバイト単位で保存され、IDE : VS 2022 がリトル エンディアンの形式で保存されるためです。つまり、上位ビットが上位アドレスに配置され、下位ビットが配置されます。低いアドレスに配置されます。
2. 現在のマシンのバイト順序を決定するプログラムを作成します。
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
int main()
{
int a = 1;
char* p = (char*)&a;//用char型的指针访问a的首地址,如果拿到的是01则是小端,如果是00则是大端
if (*p == 0)
{
cout << "大端存储" << endl;
}
else if (*p == 1)
{
cout << "小端储存" << endl;
}
return 0;
}
実行結果は次のとおりです。