如果我这样做:
#define TIMEFIXCONST 11644473600
在32位机器上,它会溢出还是存储很长时间并且仍能正常工作?我应该只定义一个全局无符号长long并使用它吗?
答案 0 :(得分:5)
宏只是一个文本替换,你不能溢出一个宏 这取决于你以后在哪里分配TIMEFIXCONST。
但根据经验,使用常数时,如果需要,请使用const int
或const long long
。
答案 1 :(得分:3)
该号码不会“存储”在任何地方。它将被插入到您使用宏的程序源代码中,就像您直接编写它一样。但是如果你希望文字本身的类型为long long,请写:
#define TIMEFIXCONST 11644473600LL
答案 2 :(得分:1)
(非?)标准方法是
#define TIMEFIXCONST 11644473600LL
然后它将被视为“长期”。之后会发生什么取决于您使用它的语句(溢出等)。如果您尝试将其分配给32位变量,它将被截断,编译器应该发出警告。
答案 3 :(得分:0)
如果将其存储在int
中,它将在x64和x86上溢出。如果将其存储在long
中,则无论在哪个平台上都不会出现问题。 #define
与记忆无关。
答案 4 :(得分:0)
#define TIMEFIXCONST 11644473600
宏TIMEFIXCONST
的任何使用都会在编译时扩展为常量11644473600
。除非您存储它,否则它不会存储在任何地方。
十进制整数常量的类型为int
,long int
或long long int
,具体取决于常量的值和类型的范围(它是第一个)这些类型的宽度足以保持价值)。除非您想明确说明类型,否则无需添加L
或LL
后缀。即便如此,11644473600L
可能属于long long
类型而非long
。
(在C89 / C90中,类型为int
,long int
或unsigned long int
,但如果unsigned long int
仅为32位,则常量本身为错误。)
由于11644473600
需要至少34位(加上符号位,如果有的话),如果long
是64位,则long
可能是long long
,或{{1}否则。
如果您将该值分配给int
变量:
int n = TIMEFIXCONST;
它将转换为int
,结果是实现定义的。您可能会获得编译时警告;如果您没有,请了解如何在编译器中启用更多警告。