2

私はこのコードを書きました:

#include "stdio.h"

static int   static_int;
static char  static_char;
static float static_float;
static char *static_pointer;
static double static_double;
static int   static_end;

int main()
{
    printf("static int      =%d\nstatic char        = %c\nstatic float      = %f\nstatic pointer    =0x%x\nstatic doub    le    =%f\n",
    static_int,static_char,static_float,static_pointer,static_double);
    printf("\n\n");
    printf("static int      =0x%x\nstatic char      =0x%x\nstatic float     =0x%x\nstatic pointer   =0x%x\nstatic_doub    le    =0x%x\nstatic end       =0x%x\n",
                  &static_int,&static_char,&static_float,&static_pointer,&static_double,&static_end);
    return 0;
}

そして、私はこの結果を得ます:

static int      =0
static char     = 
static float    = 0.000000
static pointer  =0x0
static double   =0.000000


static int      =0x804a030
static char     =0x804a034
static float    =0x804a038
static pointer  =0x804a03c
static_double   =0x804a040
static end      =0x804a048

私は混乱しています。

まず、なぜ char は 4 バイトのメモリを保持するのですか?

float が 4 バイトのメモリしか使用しないのはなぜですか? 自動で2倍に変形すると思います。double には 8 バイトが必要です。

PS: SUSE と GCC を使用しています。

4

3 に答える 3

2

char が 4 ビットのメモリを保持するのはなぜですか?

そうではありません。charC 標準で指定されているように、常に 1 バイト幅です。(どうして 4 バイトの長さだと思いますか?)

と 。float が 4 ビットのメモリしか使用しないのはなぜですか?

4バイトのことですか?適合する C 実装には 4 ビット型はありません (最小の型はchar少なくとも 8 ビット幅です)。繰り返しますが、最近のほとんどのシステムでfloatは、 は 32 ビット (および 8 ビット バイトを想定して 4 バイト) の単精度 IEEE-754 浮動小数点数でありdouble、64 ビット (8 バイト) の倍精度 IEEE -754 浮動小数点数。

そのfloatため、通常は 4 バイトの長さです。可変引数関数に渡されfloatたときに暗黙的に に変換されたとしても、オブジェクトのサイズは変わりません。doubleC では、関数の引数は値で渡されるため、 への変換はdouble基本的に、変数の型のコピーが作成される (そして関数に渡される) ことを意味します。doublefloat


(とにかく、サイズに関する情報はどこから得たのですか?sizeof演算子を使用している場所はどこにもありません...)

于 2013-08-03T13:34:06.393 に答える
2
  1. ビットではなくバイト
  2. char は 1 バイトだけを保持し、次の変数はpaddingのために 4 バイト離れたアドレスに格納されます。
  3. float は、最新のシステムのほとんどで 4 バイトかかりました。double への変換とは関係ありません。
于 2013-08-03T13:41:14.100 に答える
0

私はあなたの質問にあまりにも混乱しています。したがって、上記の質問でビットを意味していたのに、本当にバイトを意味していたと仮定して回答しています。

まず、char が 4 ビットのメモリを保持するのはなぜですか (1 つしか必要ないのですか?)。

結果には、char がメモリに 4 バイトを保持していることを示すものは何もありません。実際に出力したのは、変数が格納されているアドレスです。サイズではありません。4 バイトのワードを for char に割り当てるコンパイラは、必ずしも char が 4 バイトを占有しているとは限りません。Char は、割り当てられた 4 バイト ワードの 1 バイトのみを占有し、残りの 3 バイトはゼロで埋められます。char ポインターについて話している場合、ご存知のように、ポインターは、それが指している char 変数のアドレスを格納します。このアドレスは、サイズが 4 バイトの符号なし整数です。

変数のサイズを取得するには、sizeof演算子を使用します

と 。float が 4 ビットのメモリしか使用しないのはなぜですか? ダブルオートに変形すると思います!アリダブルテイク8ビット!

Float のサイズは 4 バイトです (32 ビット システムの場合)。したがって、コンパイラは 4 バイトを割り当てました。double のサイズは常に float の 2 倍です。そのため、コンパイラは値を格納するために 8 バイトのアドレス空間を割り当てました。float が double に変換されると考える理由がわかりません。このプログラムは、そのような自動変換を必要としません。

コンピューターは、効率を高めるために一度に 1 ワードずつメモリにアクセスするため、コンパイラは 4 バイト ワードでアドレスを割り当てます。一般的なルールは、この「アクセス長」(この場合は 4 バイト) は、少なくとも最小サイズのプリミティブ データ型のサイズ (char - 1 バイト長) でなければならないということです。

于 2013-08-03T15:06:35.170 に答える