変数のアドレスを指すポインターについて混乱しています
最後の2バイトを指しますこれはどのように機能しますか
#include <iostream>
using namespace std;
int main()
{
int i = 1;
short *j = (short*)&i;
cout << *j << endl;
}
.
変数のアドレスを指すポインターについて混乱しています
最後の2バイトを指しますこれはどのように機能しますか
#include <iostream>
using namespace std;
int main()
{
int i = 1;
short *j = (short*)&i;
cout << *j << endl;
}
.
ポインターは通常、参照される項目の先頭のアドレスを保持します。
物事の音から、あなたは明らかにリトルエンディアンシステムを使用しています [編集: これは驚くべきことではありません-たとえば、現在の (Intel) Mac とすべての Windows マシンはリトルエンディアンです]。これは、最下位バイトを意味します。 4 バイトの int がメモリの最後ではなく最初に来る:
0000001 00000000 00000000 00000000
short へのポインターを使用して最初の 2 バイトを調べると、次のようになります。
0000001 00000000
これは、2 バイトの数値として表される 1 の値を期待する方法とまったく同じです。したがって、それが得られます。
「リトル エンディアン」という名前が示すように、ビッグ エンディアン システムもあり、上記のようにデータが配置されます。そのようなマシンでは、期待した結果が得られるでしょう。完全にするために、byte1 byte0 byte3 byte2 のようなものを実行する、かなり奇妙な配置を使用するシステムもいくつかあります。
これはバイトオーダーに関係しています。アーキテクチャはint
1 を次のように保存します。
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
バイトを指していません。タイプのエンティティを指しint
ます。intがメモリ内でどのように表されるかは、実装によって異なります。そして、i
がの場合int
、*((short*)&i)
は未定義の動作です。あなたは何でも得ることができます。実際には、一般的なプラットフォームでは、次のようなものにアクセスできます。それでも何が得られるかはプラットフォームによって異なり、そのような操作は非常に低レベルのプラットフォーム固有の操作にのみ役立ちます。(Intelでは、他の人が投稿した結果が表示されます。他のプラットフォームや他の値については、状況によって異なります。)
システムのエンディアンによって異なります (x86 は通常リトルエンディアンです)。
ビッグ エンディアンでは、i の値は最上位バイトが最初に格納されます。
00000000 00000000 00000000 00000001
リトルエンディアンでは、i の値は最下位バイトから順に格納されます。
00000001 00000000 00000000 00000000
いずれの場合も、ポインタは番号の先頭を指します。ただし、システムはリトル エンディアンであるため、そのポインターを short にキャストし、逆参照して short 値を取得すると、リトル エンディアン値の最初の 2 バイトが取得されます。
00000001 00000000
リトル エンディアンでは、これは 1 の短い値であり、得られる結果です。ビッグ エンディアン システムでまったく同じコードを実行すると、値は 0 になります。
それはアーキテクチャに依存します。そして、特定の実装は完全に無関係である必要があります (そうでない場合は、何か間違ったことをしている可能性があります)。