4

変数のアドレスを指すポインターについて混乱しています 画像

最後の2バイトを指しますこれはどのように機能しますか

#include <iostream>
using namespace std;

int main()
{
    int i = 1;
    short *j  = (short*)&i;
    cout << *j << endl;
}

.

4

5 に答える 5

11

ポインターは通常、参照される項目の先頭のアドレスを保持します。

物事の音から、あなたは明らかにリトルエンディアンシステムを使用しています [編集: これは驚くべきことではありません-たとえば、現在の (Intel) Mac とすべての Windows マシンはリトルエンディアンです]。これは、最下位バイトを意味します。 4 バイトの int がメモリの最後ではなく最初に来る:

0000001 00000000 00000000 00000000

short へのポインターを使用して最初の 2 バイトを調べると、次のようになります。

0000001 00000000

これは、2 バイトの数値として表される 1 の値を期待する方法とまったく同じです。したがって、それが得られます。

「リトル エンディアン」という名前が示すように、ビッグ エンディアン システムもあり、上記のようにデータが配置されます。そのようなマシンでは、期待した結果が得られるでしょう。完全にするために、byte1 byte0 byte3 byte2 のようなものを実行する、かなり奇妙な配置を使用するシステムもいくつかあります。

于 2012-04-02T15:25:57.407 に答える
4

これはバイトオーダーに関係しています。アーキテクチャはint1 を次のように保存します。

00000001 00000000 00000000 00000000
^^^^^^^^
  this is the address that is stored in the pointer.
|------- -------- -------- --------| int (4 bytes)
|------- -------|                    short (2 bytes)

shortこれは、2 バイトに切り捨てられても 1 のままです。

ところで。すべてのバイトを単独で出力してみてください:

unsigned char* p = (unsigned char*)&i;
for (unsigned j = 0; j < sizeof(int); j++) {
  std::cout << p[j] << " ";
}
std::cout << std::endl;

質問で提案されているのではなく1 0 0 0、印刷する必要があります。 0 0 0 1

于 2012-04-02T15:26:18.983 に答える
3

バイトを指していません。タイプのエンティティを指しintます。intがメモリ内でどのように表されるかは、実装によって異なります。そして、i がの場合int*((short*)&i)は未定義の動作です。あなたは何でも得ることができます。実際には、一般的なプラットフォームでは、次のようなものにアクセスできます。それでも何が得られるかはプラットフォームによって異なり、そのような操作は非常に低レベルのプラットフォーム固有の操作にのみ役立ちます。(Intelでは、他の人が投稿した結果が表示されます。他のプラットフォームや他の値については、状況によって異なります。)

于 2012-04-02T15:37:52.343 に答える
3

システムのエンディアンによって異なります (x86 は通常リトルエンディアンです)。

ビッグ エンディアンでは、i の値は最上位バイトが最初に格納されます。

00000000 00000000 00000000 00000001

リトルエンディアンでは、i の値は最下位バイトから順に格納されます。

00000001 00000000 00000000 00000000

いずれの場合も、ポインタは番号の先頭を指します。ただし、システムはリトル エンディアンであるため、そのポインターを short にキャストし、逆参照して short 値を取得すると、リトル エンディアン値の最初の 2 バイトが取得されます。

00000001 00000000

リトル エンディアンでは、これは 1 の短い値であり、得られる結果です。ビッグ エンディアン システムでまったく同じコードを実行すると、値は 0 になります。

于 2012-04-02T15:28:05.053 に答える
3

それはアーキテクチャに依存します。そして、特定の実装は完全に無関係である必要があります (そうでない場合は、何か間違ったことをしている可能性があります)。

于 2012-04-02T15:24:37.060 に答える