2

C の符号付き整数の正確な境界を知る必要があるプログラムに取り組んでいます。私の質問は、この境界に依存するプログラムをコンパイルする場合、ローカル環境をチェックしてビット数を確認する必要があるかどうかです。値を保持するために使用されますか?

私はこれをよりよく説明しようとします。符号付き整数を扱う C プログラムを作成し、そのプログラムの一部が大きな数に依存しているときはいつでも、4,294,967,296 + 1 などの単純な計算がオーバーフローするのではないかと心配しています。この数は負の数にロールオーバーしますか?

プログラムのコンパイル方法 (つまり、プログラムのコンパイルに使用するコンパイラ) に依存しますか、それとも .exe が実行される環境に依存しますか?

ご協力いただきありがとうございます!

4

5 に答える 5

4

((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))

これはあなたに限界を与えるはずです

于 2012-05-16T07:02:55.013 に答える
2

プログラムをどのようにコンパイルしたかにのみ依存します。つまり、実行時に「環境」をチェックする必要はありません。<stdint.h>重要なものについては、たとえばの固定サイズの整数型を使用する必要がありますint32_t

の定数を使用して、整数型の範囲を確認でき<limits.h>ますINT_MAX

于 2012-05-16T07:02:55.427 に答える
2

ヘッダー#include <limits.h>には、次のような必要な定数が含まれています。

  • CHAR_BIT- のビット数char
  • CHAR_MAX- プレーンの最大値char
  • SCHAR_MAX- の最大値signed char
  • UCHAR_MAX- の最大値unsigned char
  • SHRT_MAX- の最大値short
  • USHRT_MAX- の最大値unsigned short
  • INT_MAX
  • UINT_MAX
  • LONG_MAX
  • ULONG_MAX
  • LLONG_MAX
  • ULLONG_MAX

署名された型の場合、最小値もあります。

  • CHAR_MIN-プレーンchar; 値は 0 または負の数の場合があります。
  • SCHAR_MIN
  • SHRT_MIN
  • INT_MIN
  • LONG_MIN
  • LLONG_MIN

UINT_MAX + 1オーバーフロー時の符号なし算術演算の動作は完全に定義されています (オペランドの型に応じて、生成される値は正しいモジュラスまたは同様のものになります)。

オーバーフロー時の符号付き算術演算の動作は未定義であり、調査するよりも回避する方がはるかに適切です。特定のコンパイラは、選択した方法でそれを処理できます。従来、オーバーフローの値はしばしば折り返されていました (2 つの大きな正の符号付き整数を追加すると、負の値が生成されることがよくありました)。ただし、最新の C コンパイラはそれほど寛容ではありません。

オーバーフローが本当に心配な場合は、上記の整数定数を使用してオーバーフローを防ぐことができます。

于 2012-05-16T07:13:21.573 に答える
1

limits.hヘッダーを使用します。さまざまなタイプの最大値と最小値の定数を定義します。

于 2012-05-16T07:04:42.457 に答える
1

4,294,967,296 + 1 と言います。この数は負の数にロールオーバーしますか?

その数値は、署名されていない場合、追加すると 0 にロールオーバーされます。unsigned int は、最大の正の数に 1 を追加すると、最小の負の数にロールオーバーします。

于 2012-05-16T07:05:11.967 に答える