64如果我做的:ç定义在32位
#define TIMEFIXCONST 11644473600
32位机器上,将它溢出或将它保存为一个很长很长,仍然正常工作?我应该只是定义一个全局的无符号long long并使用它呢?
64如果我做的:ç定义在32位
#define TIMEFIXCONST 11644473600
32位机器上,将它溢出或将它保存为一个很长很长,仍然正常工作?我应该只是定义一个全局的无符号long long并使用它呢?
一个宏只是一个文本替换,你不能溢出一个宏。
这取决于您在以后分配TIMEFIXCONST的位置。
但是根据经验,如果需要,使用常量时使用const int
或const long long
。
如果将它存储在int
中,它将在x64和x86上溢出。如果您将它存储在long
中,那么在任一平台上都不会有问题。 #define
对内存没有影响。
不能保证适合'long' - int是16位的最小值,'long'是32位的最小值(不同的x86和x86-64 ABI定义了这些不同的值)。 – caf 2009-10-29 20:31:19
A(非?)做这将是
#define TIMEFIXCONST 11644473600LL
然后,它会被视为 “很长很长” 的标准方式。之后会发生什么取决于你使用它的语句(溢出等)。如果您尝试将其分配给32位变量,它将被截断,编译器应该发出警告。
这是标准 - 只要标准是C99。如果标准是C89,则它是非标准的。 – 2009-10-30 03:42:48
该号码不是“存储”在任何地方。它只会插入到使用宏的程序源代码中,就像直接写入它一样。但是如果你想字面本身是类型的很长很长,写:
#define TIMEFIXCONST 11644473600LL
#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
。
如果分配该值到int
变量:
int n = TIMEFIXCONST;
它会被转换为int
,并且结果是实现定义的。你会大概得到编译时警告;如果你不知道如何在你的编译器中启用更多的警告。
如果你害怕溢出,我可以建议你使用后缀“L”吗? – luiscubal 2009-10-29 18:56:33
如果你需要很长的时间,正确的后缀是'LL',当然;一个'L'表示很长。这假定你有一个支持C99的编译器。 – 2009-10-30 03:42:17
'11644473600L'可能仍然是'long long'类型。但是不需要后缀;常数是可以保持其值的任何类型('int','long','long long')。 – 2015-11-27 12:17:23