将每年的秒数定义为C中的宏?

时间:2013-08-02 01:26:46

标签: c macros c-preprocessor

在MCQ考试中,有两个选择:
#define SEC (60*60*24*365)
#define SEC (60*60*24*365UL)
这两种可能性之间是否存在差异,使其成为更好的选择?

2 个答案:

答案 0 :(得分:1)

常量6024365都有int类型,因此这些值的乘法也将在该类型中完成。尽管如此,允许int中可表示的最大值低至32767,因此完整的乘法可能会溢出。

但是,即使使用365UL的版本也不安全。因为乘法从左到右关联,所以第一次乘法是60 * 60(这很好),然后结果乘以24.数学结果是86400,可能已经溢出{{{ 1}}。

安全选项是:

int

但最简单的是制作#define SEC (60*60*24L*365) 类型的所有常量:

long

(这种表述在闰年也是错误的,包含闰秒的年份也是错误的。)

答案 1 :(得分:0)

选择第二个 #define SEC(60 * 60 * 24 * 365UL)“。

UL表示此号码的类型为unsigned long。由于60 * 60 * 24 * 365非常大,因此某些编译器可能会出现溢出错误