8

4バイトの整数があり、それを2バイトの短い整数にキャストしたいとしましょう。(リトル エンディアンとビッグ エンディアンの両方で) short integer は、この 4Byte 整数の最下位 2 バイトで構成されるというのは正しいですか?

2 番目の質問:
リトル エンディアンおよびビッグ エンディアン プロセッサでこのようなコードを実行すると、どのような結果になるでしょうか?

int i = some_number;  
short s = *(short*)&i;

ビッグ エンディアン プロセッサの IMHO では最上位 2 バイトがコピーされ、リトル エンディアンでは最下位 2 バイトがコピーされます。

4

5 に答える 5

12

どちらの短い整数でも、この 4 バイト整数の最下位 2 バイトで構成されるというのは正しいですか?

はい、定義上。

bigE と littleE の違いは、最下位バイトが最下位アドレスにあるかどうかです。リトルエンディアン プロセッサでは、最下位アドレスが最下位ビットであり、x86 ではこのように処理されます。

これらは小さな E でも同じ結果になります。

short s = (short)i;
short s = *(short*)&i;

ビッグ エンディアン プロセッサでは、最上位アドレスは最下位ビットであり、68000 と Power PC はこのようにします (実際には Power PC は両方である可能性がありますが、Apple の PPC マシンは bigE を使用します)。

これらは大きな E でも同じ結果になります。

short s = (short)i;
short s = ((short*)&i)[1]; // (assuming i is 4 byte int)

ご覧のとおり、リトルエンディアンを使用すると、オペランドの大きさを知らなくても、オペランドの最下位ビットを取得できます。little E には、下位互換性を維持するという利点があります。

では、ビッグエンディアンの利点は何ですか? 読みやすい 16 進ダンプを作成します。

実際、Motorola のエンジニアは、下位互換性よりも 16 進ダンプを読み取る負担を軽減することが重要であると考えていました。インテルのエンジニアは、反対のことを信じていました。

于 2010-02-11T21:30:06.793 に答える
2
  1. はい。値を変換するとき、エンディアンを気にする必要はありません。

  2. はい。ポインターを変換するときは、そうします。

于 2010-02-11T21:15:20.160 に答える
1

まず、ご存知かもしれませんが、int のサイズは 4 バイト、short のサイズはすべてのプラットフォームで 2 バイトであることが保証されているわけではありません。

最初の質問で、次のような意味がある場合:

int i = ...;
short s = (short)i;

はい、sの下位バイトが含まれますi

2 番目の質問に対する答えもイエスだと思います。バイト レベルでは、システムのエンディアンが影響します。

于 2010-02-11T21:19:18.030 に答える
1

2番目の例に注意する必要があります

int i = some_number;  
short s = *(short*)&i;

厳密なエイリアシング規則に違反しているため、有効な C コードではありません。一部の最適化レベルやコンパイラでは失敗する可能性があります。

そのためにユニオンを使用します。

union {
   int   i;
   short s;
} my_union;

my_union.i = some_number;
printf("%d\n",my_union.s);

また、他の人が指摘したように、int が 4 バイトになると想定することはできません。特定のサイズが必要な場合は、int32_t と int16_t を使用することをお勧めします。

于 2010-02-11T21:31:31.183 に答える
1

本当に int を short に変換したい場合は、次のようにします。

short int_to_short(int n) {
  if (n < SHRT_MIN) return SHRT_MIN;
  if (n > SHRT_MAX) return SHRT_MAX;
  return (short)n;
}

エンディアンについても心配する必要はありません。言語が処理してくれます。n が short の範囲内にあることが確実な場合は、チェックもスキップできます。

于 2010-02-11T21:34:23.950 に答える