4

いくつかの Web サイトからコピーしたサンプル プログラムがあります。

int main(void)
{
   int answer;
   short x = 1;
   long y = 2;
   float u = 3.0;
   double v = 4.4;
   long double w = 5.54;
   char c = 'p';

   typedef enum
   {
      kAttributeInvalid,
      kBooleanAttributeActive,
      kBooleanAttributeAlarmSignal,
      kBooleanAttributeAlign64,
      kBooleanAttributeAutoNegotiationComplete,
   }codes_t;

  /* __DATE__, __TIME__, __FILE__, __LINE__ are predefined symbols */
  #if 0
  printf("Date : %s\n", __DATE__);
  printf("Time : %s\n", __TIME__);
  printf("File : %s\n", __FILE__);
  printf("Line : %d\n", __LINE__);
  #endif

  /* The size of various types */
  printf("The size of int         %zu\n", sizeof(answer));
  printf("The size of short       %zu\n", sizeof(x));
  printf("The size of long        %zu\n", sizeof(y));
  printf("The size of float       %zu\n", sizeof(u));
  printf("The size of double      %zu\n", sizeof(v));
  printf("The size of long double %zu\n", sizeof(w));
  printf("The size of char        %zu\n", sizeof(c));
  printf("The size of enum        %zu\n", sizeof(codes_t));

  return 0;
}

このプログラムを実行したところ、次のような出力が得られました。

The size of int         4
The size of short       2
The size of long        8
The size of float       4
The size of double      8
The size of long double 16
The size of char        1
The size of enum        4

64 ビット Ubuntu を実行している Linux PC でこれを実行しています。私の質問は、32 ビット マシンで同じプログラムを実行した場合、異なる結果が表示されるかどうかです。つまり、基本データのサイズはタイプは依存します

  1. プロセッサー
  2. オペレーティング·システム
  3. 他に何か
4

5 に答える 5

7

私の質問は、32 ビット マシンで同じプログラムを実行した場合、異なる結果が表示されるかどうかです。

多分。またはそうでないかもしれません。

または、言い換えると、基本的なデータ型のサイズは、1) プロセッサ 2) オペレーティング システム 3) その他に依存しますか?

  1. はい、2. はい、3. はい。たとえば、64 ビット OS で 32 ビット互換モードで 32 ビット アプリを実行する場合、ほとんどの場合、32 ビット ワード サイズが使用されます (もちろん、そのようにコンパイルされました)。ああ、はい、それはコンパイラにも依存している可能性があります。

「そして、あなたのコンパイラフラグは...」 (Thanks, Kay!)

于 2013-02-11T22:06:21.057 に答える
4

変数の正確なサイズが気になる場合は、

#include <stdint.h>

そして、そこで定義されている固定幅型を使用します。

uint8_t
uint16_t
uint32_t
uint64_t

または彼らの署名されたいとこ

int8_t
int16_t
int32_t
int64_t

C のネイティブ型のサイズに依存しないでください。コンパイラが異なれば規則も異なります。

于 2013-02-11T22:09:05.670 に答える
4

いくつかのライブラリ [おそらく glibc のみ] を 32 ビット バリアントにインストールする必要があることを条件として、gcc -m32 myprog.c[またはclang -m32 myprog.c] を使用して自分でこれを試すことができるはずです。

ただし、gcc ベースのコンパイラーを使用して 64 ビット x86 Linux システムから 32 ビット x86 Linux システムに移行した場合に変更されるリストされているアイテムの唯一のものは、long. x86、gcc などの厳格な修飾に注意してください。コンパイラには多くの自由があります。int誰かが、32 ビット システムで 16 ビットと 64ビットを使用する Linux 用のコンパイラをそれほどlong難しくなく作成できます。そのコンパイラを使用して Linux カーネルと多くの Linux ツールをコンパイルすると、おそらく失敗します [gccそのコンパイラでのコンパイルを含む可能性が最も高い]。しかし、「このアーキテクチャで」、「このOSで」、または「このコンパイラで」とは言えません... OTHERパラメーターが何であるかを修飾することもできません。

適切な例: Microsoft C/C++ コンパイラには、long64 ビット システムでも 32 ビットの があります。なぜ、あなたが尋ねるのを聞いたのですか?Windows が Intel 286/386 プロセッサ上の 16 ビット OS だったときから、多数の Windows API 関数longが 32 ビット値をレガシーとして使用するためです。システム コール (の一部) は Windows で非常に長い間後方互換性があるため、16 ビット システム用に記述されたコードは 64 ビット Windows でも動作します [コードがいくつかの非常に珍しいシステム コールを使用している場合を除き、もちろん、 、STYLEは少し古く見えます]。64ビット値に変更longすると、その機能の一部が壊れてしまうため、MSのコンパイラ担当者はlong= 32ビットに固執することにしました。64 ビット整数が必要な場合は、long longまたはint64_tまたは何か他のものを使用する必要があります。long. もちろん、これはsizeof(long) == sizeof(void *). うまくいけば、そのようなコードのほとんどはすでに修正されています...

于 2013-02-11T22:32:34.933 に答える
2

はい、ハードウェア、OS、コンパイラ、場合によっては言語にも依存します。

しかし、x86 Linux では、long は 32 ビット プラットフォームでは 8 ではなく 4 バイトになります。その他はすべて同じままだと思います (long double についてはわかりません)。

逸話:

私は、ワード サイズが 24 ビットで、すべてのネイティブ型のサイズが 1 ワードである 24 ビット システムで作業しました。sizeof(文字)? 1 (つまり、24 ビット)。sizeof(int)? 1 (つまり、24 ビット)。など楽しい!

于 2013-02-11T22:08:11.803 に答える
2

コンパイラはサイズ固有の命令を発行し、メンバーを構造体に配置し、必要なすべてのアドレス計算の構造体サイズを認識しなければならないため、サイズはコンパイル時にコンパイラによって固定的に設定されます。

そのため、ソースを 64 ビット バイナリにコンパイルしてさまざまなシステムで実行すると、システムがバイナリをサポートしている場合、型は実行ごとに同じサイズになります。

その後、ソースを 32 ビット バイナリにコンパイルするか、別のコンパイラ スイッチを使用する場合、それを一連の異なるシステムで実行すると、数値は 64 ビットの場合と異なる場合がありますが、すべての異なるシステムで一貫性があります。システム。

于 2013-02-11T22:18:36.690 に答える