2

私の limits.h では、signed long の制限は次のように指定されています - define LONG_MAX 2147483647L

ただし、次のコード行は「式の整数オーバーフロー」の警告を引き起こしますが、プログラムはファイルを実行し、期待値を生成します。

long universe_of_defects = 1L * 1024L * 1024L * 1024L * 2L - 1L;
printf("The entire universe has %ld bugs.\n", universe_of_defects);

印刷される値は - 2147483647 です。

では、この警告の原因は何であり、どのように修正できるでしょうか? 私は GCC を持っています - gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

注 - コードは「Learn C the hard way」からのものです

4

2 に答える 2

2

中間結果の 1 つがオーバーフローするため、技術的には未定義の動作につながります。

これを回避するには、おそらく中間結果を保持できる型で計算を実行します。たとえば、unsigned long ( UL) または long long ( LL) です。

于 2013-03-11T09:29:59.413 に答える
2

その計算の最初の部分がオーバーフローします:

    1L * 1024L * 1024L * 1024L * 2L  -  1L
//  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  2,147,483,648  >  2,147,483,647    It's too late!
//  Overflow occurs                    previous value is overflowed

試す

long universe_of_defects = 1LL * 1024 * 1024 * 1024 * 2 - 1;

値をタイプに昇格LLさせてから、再び に適合できるようにします。long long-1long

于 2013-03-11T09:36:10.197 に答える