-1

私はバイトとポインタを取得しようとしていますが、それらがどのように格納されているかは、誰でも説明したり、私の質問のいくつかに答えたりすることができます. ありがとうございました

int num = 513;  <-- allocating a 4 bit memory by initializing
//[01][02][00][00] <-- (numbers are sorted and shown as litle endian)

char * ptr = &num; //char is (one byte)
   ↓
//[01][02][00][00] 
// pointer always start from the [0] (as in this array byte length) 
// in the allocated address in the memory ptr[0] is in this case = [01] 
// (printed as %x02 "printf("the byte %02x\n",ptr[0]);" - if it's only 
//single number 1 a zero will be added on the length so it prints out as 01)

int * ptr = &num; //now creating a pointer with the type of int (four bytes)
    ↓   ↓   ↓   ↓
//[01][02][00][00]
  • この int ポインターの最初のバイトにアクセスするにはどうすればよいですか? 【質問01】
  • 最初のバイト ([01]) 内のバイトを確認する方法はありますか? 【質問02】
  • ポインターはアドレスをどこに保存しますか? 0x233828ff21 などのアドレスを保存するために RAM にメモリ空間を割り当てる必要がありますか? その場合、この (0x233828ff21) アドレスには多くのバイトが必要ですか? 【質問03】
  • この int ポインターは、型の長さ (4 バイト) をどこに格納しますか? 【質問05】
  • long long * ptr = &num;[01][02][00][00][00][00][00][00]のようなより長いバイトのメモリ割り当てを持つ型を宣言するとどうなるか、これらの最後の 4 つが別のプログラムによって既に割り当てられて使用されている可能性はありますか? 読めますか?【質問06】
  • バイナリは 0 と 1 だけで、そのうちの 1 つ (0 または 1) はバイトと呼ばれますか? 【質問07】
  • 1バイトは8ビットですよね?この Web サイト ( https://www.rapidtables.com/convert/number/decimal-to-binary.html )で数字の 1 を 8 に変換すると、16 ビットの 0000000000000001 になるのはなぜですか? 【質問08】
4

2 に答える 2

1

• この int ポインタの最初のバイトにアクセスするにはどうすればよいですか? 【質問01】

一般的には、任意のバイトにアクセスするunsigned charよりも使用する方が望ましいcharので、そうしましょう。

の後unsigned char *ptr = &num;ptrは へのポインタであり、 のようにまたはunsigned charを使用して の最初のバイトにアクセスできます。int*ptrptr[0]printf("The first byte, in hexadecimal, is 0x%02hhx.\n", *ptr);

代わりに がある場合int *ptr = &num;、最初のバイトに直接アクセスする方法はありません。ptrこれは へのポインタであり、個々のバイトにアクセスするには、またはその他のシングルバイト型intへのポインタが必要です。のようにへのポインタにunsigned char変換すると、 で個々のバイトにアクセスできます。ptrunsigned char(unsigned char *) ptr* (unsigned char *) ptr

• 最初のバイト ([01]) 内のバイトを確認する方法はありますか? 【質問02】

C 標準では、バイトの個々のビットを表示する方法は提供されていません。一般に、プログラマーは上記のように値を 16 進数で出力し、16 進数からビットを読み取ります。独自のルーチンを作成して、バイトからバイナリ出力を書き込むこともできます。

• ポインタはアドレスをどこに保存しますか。0x233828ff21 などのアドレスを保存するために RAM にメモリ空間を割り当てる必要がありますか? その場合、この (0x233828ff21) アドレスには多くのバイトが必要ですか? 【質問03】

ポインターは、他の変数intchar変数と同様の変数です。値が格納されるメモリ内に独自のスペースがあります。(メモリを持つ変数のこのモデルは、C プログラムの動作を指定するために使用されます。プログラムがコンパイラによって最適化されると、これが変わる場合があります。)

現在のシステムでは、ターゲット アーキテクチャに応じて、ポインターは一般に 32 ビットまたは 64 ビット (8 ビット バイトが 4 つまたは 8 つ) です。でどれを見つけることができますprintf("The size of a 'char *' is %zu bytes.\n", sizeof (char *));。(C 標準では、異なる型のポインターを異なるサイズにすることができますが、最新の C 実装ではまれです。)

• この int ポインターは、型の長さ (4 バイト) をどこに格納しますか? 【質問05】

コンパイラはポインタのサイズを認識しています。ポインター自体は、それが指している対象の長さを格納しません。ポインターを使用すると、コンパイラーは単に適切なコードを生成します。を使用*ptrしてポインタが指す値を取得する場合、コンパイラは、 の型が の場合はロード バイト命令ptrを生成し、型がchar *の 4 バイト ロード命令を生成します(およびは の 4 バイトです)。あなたのC実装)。ptrint *int

• long long * ptr = # [01][02][00][00][00][00][00][00] などのより長いバイト メモリ割り当てを持つ型を宣言するとどうなるかlong long から 4 バイトの int まで、最後の 4 つが別のプログラムによって既に割り当てられて使用されている可能性はありますか? 読めますか?【質問06】

long long8 バイト整数で、 がlong long *ptr4 バイト整数を指している場合、C 標準では を使用しようとしたときの動作が定義されていません*ptr

汎用のマルチユーザー オペレーティング システムでは、別のプログラムが の後のメモリをint割り当てることはできません (このプログラムと別のプログラムの両方がメモリを共有するように設定されている場合を除く)。各プロセスには独自の仮想アドレス空間が与えられ、メモリは別々に保持されます。

long long *ptrプログラムでこれを使用すると、 int. これにより、データの破損や配置エラーなど、プログラムにさまざまな種類のバグが発生する可能性があります。

• バイナリは 0 と 1 だけで、そのうちの 1 つ (0 または 1) をバイトと呼びますか? 【質問07】

2 進数の 1 桁が「ビット」です。複数の 2 進数は「ビット」です。

特定のコンピューターが単位として操作するビットの最小グループは「バイト」です。バイトのサイズはさまざまです。初期のコンピューターには、さまざまなサイズのバイトがありました。現代のコンピューターは、ほとんどすべて 8 ビットのバイトを使用しています。

プログラムに header が含まれている場合、1 バイトのビット数を提供する<limits.h>という名前のマクロが定義されています。CHAR_BITほとんどすべての最新の C 実装では 8 です。

• 1 バイトは 8 ビットですよね?この Web サイト ( https://www.rapidtables.com/convert/number/decimal-to-binary.html )で数値 1 を 8 に変換すると、16 ビット 0000000000000001 になるのはなぜですか? 【質問08】

Web サイトは、単に 1 バイトに変換しているだけではありません。

値が符号付き整数型として収まる 16、32、または 64 ビットの少なくとも 1 つを選択して、少なくとも 16 ビットを示しているようです。

于 2022-01-13T16:41:23.307 に答える