MCQ 試験では、次の 2 つの選択肢が
#define SEC (60*60*24*365)
あり
ました。
#define SEC (60*60*24*365UL)
4678 次
2 に答える
2
定数60
、24
および365
すべては typeint
を持っているため、これらの値の乗算はその型でも行われます。ただし、 で表現可能な最大値はint
32767 まで低くすることができます。そのため、乗算全体がオーバーフローする可能性があります。
ただし、使用するバージョンでも365UL
安全ではありません。乗算は左から右に関連付けられるため、最初に実行される乗算は60 * 60
(これで問題ありません) であり、その結果に 24 が乗算されます。この数学的結果は 86400 であり、これは既に をオーバーフローしている可能性がありint
ます。
安全なオプションは次のとおりです。
#define SEC (60*60*24L*365)
しかし、 type のすべての定数を作成するのが最も明確ですlong
:
#define SEC (60L*60L*24L*365L)
(この定式化は、うるう年やうるう秒を含む年でも間違っています)。
于 2013-08-02T01:56:14.257 に答える
0
2 番目の#define SEC(60*60*24*365UL)を選択します。
UL は、この番号の unsigned long のタイプを意味します。60*60*24*365 は非常に大きいため、コンパイラによってはオーバーフロー エラーが発生する場合があります。
于 2013-08-02T01:38:11.780 に答える