在MCQ考试中,有两个选择:
#define SEC (60*60*24*365)
或
的 #define SEC (60*60*24*365UL)
这两种可能性之间是否存在差异,使其成为更好的选择?
答案 0 :(得分:1)
常量60
,24
和365
都有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非常大,因此某些编译器可能会出现溢出错误