0

32 ビット システムで動作することがわかっている C プログラムがあります。64ビットシステム(少なくとも私のもの)では、ある程度機能してから停止します。いくつかのフォーラムを読むと、プログラムは 64 ビットで安全ではない可能性がありますか? これは、32 ビット システムと 64 ビット システムの間のデータ型の違いに関係していると思います。

char両方で同じですか?intまたはlongそのunsignedバリアントはどうですか?32 ビット プログラムが 64 ビット安全ではない他の方法はありますか? アプリケーションが 64 ビットで安全であることを確認したい場合、どのような手順を踏む必要がありますか?

4

1 に答える 1

1

C の通常のデータ型には、特定のビット幅ではなく最小範囲の値があります。たとえば、ashortは、少なくとも -32767 から 32767 までを表すことができなければなりません。

そうです、あなたのコードが 32768 でラップアラウンドする値に依存している場合、ショートが大きな 128 ビットの巨獣であるとうまく動作しない可能性があります。

特定の幅のデータ型が必要な場合は、などを調べてstdint.hくださいint64_t。特定の幅、「少なくとも」幅など、さまざまな選択肢があります。また、「通常の」整数型とは異なり、これらには 2 の補数が必要です。

  • 特定の正確な幅を持つ整数型。
  • 少なくとも特定の指定された幅を持つ整数型。
  • 少なくとも特定の指定された幅を持つ最速の整数型。
  • オブジェクトへのポインターを保持するのに十分な幅の整数型。
  • 最大幅を持つ整数型。

たとえば、次からC11 7.20.1.1 Exact-width integer types:

typedef 名 intN_t は、幅 N、パディング ビットなし、および 2 の補数表現の符号付き整数型を指定します。したがって、int8_t は、正確に 8 ビット幅の符号付き整数型を示します。

ルール (ポインターを整数にキャストしないなど) に従っていれば、コードはどのような実装やアーキテクチャでもコンパイルおよび実行されるはずです。

そうでない場合は、デバッグを開始してから、問題を引き起こしていると思われる詳細情報とコードをそのような専用のフォーラム サイトに投稿するだけです。最近、どこでそれらの1つを見ましたか?:-)

于 2012-04-05T04:16:28.413 に答える