2009-10-29 21 views
2

64如果我做的:ç定义在32位

#define TIMEFIXCONST 11644473600 

32位机器上,将它溢出或将它保存为一个很长很长,仍然正常工作?我应该只是定义一个全局的无符号long long并使用它呢?

+1

如果你害怕溢出,我可以建议你使用后缀“L”吗? – luiscubal 2009-10-29 18:56:33

+0

如果你需要很长的时间,正确的后缀是'LL',当然;一个'L'表示很长。这假定你有一个支持C99的编译器。 – 2009-10-30 03:42:17

+0

'11644473600L'可能仍然是'long long'类型。但是不需要后缀;常数是可以保持其值的任何类型('int','long','long long')。 – 2015-11-27 12:17:23

回答

5

一个宏只是一个文本替换,你不能溢出一个宏。
这取决于您在以后分配TIMEFIXCONST的位置。

但是根据经验,如果需要,使用常量时使用const intconst long long

0

如果将它存储在int中,它将在x64和x86上溢出。如果您将它存储在long中,那么在任一平台上都不会有问题。 #define对内存没有影响。

+0

不能保证适合'long' - int是16位的最小值,'long'是32位的最小值(不同的x86和x86-64 ABI定义了这些不同的值)。 – caf 2009-10-29 20:31:19

1

A(非?)做这将是

#define TIMEFIXCONST 11644473600LL

然后,它会被视为 “很长很长” 的标准方式。之后会发生什么取决于你使用它的语句(溢出等)。如果您尝试将其分配给32位变量,它将被截断,编译器应该发出警告。

+0

这是标准 - 只要标准是C99。如果标准是C89,则它是非标准的。 – 2009-10-30 03:42:48

3

该号码不是“存储”在任何地方。它只会插入到使用宏的程序源代码中,就像直接写入它一样。但是如果你想字面本身是类型的很长很长,写:

#define TIMEFIXCONST 11644473600LL 
0
#define TIMEFIXCONST 11644473600 

任何使用宏TIMEFIXCONST在编译时扩展到固定11644473600。除非存储它,否则它不会存储在任何地方。

十进制整数常数为int类型,long int,或long long int的,这取决于常数的值和类型的范围(它是第一那些类型这是足够宽以容纳该值的)。没有必要添加LLL后缀,除非您想明确说明类型。即使如此,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,并且结果是实现定义的。你会大概得到编译时警告;如果你不知道如何在你的编译器中启用更多的警告。