C在32位上定义64位

时间:2009-10-29 18:54:52

标签: c c-preprocessor

如果我这样做:

#define TIMEFIXCONST 11644473600
在32位机器上,它会溢出还是存储很长时间并且仍能正常工作?我应该只定义一个全局无符号长long并使用它吗?

5 个答案:

答案 0 :(得分:5)

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

但根据经验,使用常数时,如果需要,请使用const intconst 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。除非您存储它,否则它不会存储在任何地方。

十进制整数常量的类型为intlong intlong long int,具体取决于常量的值和类型的范围(它是第一个)这些类型的宽度足以保持价值)。除非您想明确说明类型,否则无需添加LLL后缀。即便如此,11644473600L可能属于long long类型而非long

(在C89 / C90中,类型为intlong intunsigned long int,但如果unsigned long int仅为32位,则常量本身为错误。)

由于11644473600需要至少34位(加上符号位,如果有的话),如果long是64位,则long可能是long long,或{{1}否则。

如果您将该值分配给int变量:

int n = TIMEFIXCONST;

它将转换为int,结果是实现定义的。您可能会获得编译时警告;如果您没有,请了解如何在编译器中启用更多警告。