0

プログラムでエンディアンをテストする最も一般的な方法は、次のように char* にキャストすることです。

short temp = 0x1234;
char* tempChar = (char*)&temp;

しかし、次のように short* にキャストすることで実行できますか?

unsigned char test[2] = {1,0};  
if ( *(short *)test == 1)
    //Little-Endian
else
    //Big-Endian

「テスト」バッファーが (x86 プラットフォームで) リトル エンディアン規則 (右から左へ: 下位アドレスで「0」、上位アドレスで「1」) を使用してメモリに保存されるというのは正しいですか? 「一時」変数とは?

より一般的には、文字列がある場合: char tab[] = "abcdef"; それはどのようにメモリに保存されますか?「fedcba」のように逆になりますか?

どうも。あらかじめ:-)

PS。

プログラムのデータがシステム メモリ内でどのように見えるかを正確に確認する方法はありますか? 「実生活」でリトルエンディアンでのバイトスワップを見たいと思います。

4

4 に答える 4

2

あなたのコードはおそらく実際に動作するでしょう (試してみただけでもよいでしょう!)。ただし、技術的には、未定義の動作を呼び出します。標準では、別の型のポインターを介して char 配列にアクセスすることは許可されていません。

より一般的には、文字列がある場合: char tab[] = "abcdef"; それはどのようにメモリに保存されますか?「fedcba」のように逆になりますか?

いいえ。それ以外の場合tab[0]f.

于 2012-06-25T21:16:32.613 に答える
0

エンディアンをチェックするための別の方法が機能します。

char tab[] = "abcdef"同じ順序で保存されます。abcdef

エンディアンは、複数のバイト (short、int など) にアクセスするときに影響します。tab[]リトル エンディアン マシンを使用して短い配列としてアクセスしようとすると、ba、dc、fe として読み取られます (実際のバイトに相当するものが何であれ、これは、文字が短い形式で「評価」される順序です)。

于 2012-06-25T21:38:00.753 に答える
0

ユニオンを使用する方が安全です。つまり、標準に準拠しています。

于 2012-06-25T22:58:04.007 に答える
0

どちらの方法も動作することが保証されていません。さらに、後者は未定義の動作を引き起こします。

の場合、最初は失敗しますsizeof(char) == sizeof(short)

2 番目も同じ理由で失敗する可能性があり、これも安全ではありません: ポインター キャストの結果は short のアラインメントが正しくない可能性があり、(short) 値にアクセスすると未定義の動作が呼び出されます (3.10.15)。

しかし、はい、char バッファーはメモリに順次格納されるため&test[0] < &test[1]、より一般的には、他の人が既に述べたように、char tab[] = "abcdef"エンディアンに関係なく、逆になったり、並べ替えられたりすることはありません。

于 2012-06-25T22:10:52.890 に答える