2

MCQ 試験では、次の 2 つの選択肢が
#define SEC (60*60*24*365) あり ました。
#define SEC (60*60*24*365UL)

4

2 に答える 2

2

定数6024および365すべては typeintを持っているため、これらの値の乗算はその型でも行われます。ただし、 で表現可能な最大値はint32767 まで低くすることができます。そのため、乗算全体がオーバーフローする可能性があります。

ただし、使用するバージョンでも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 に答える