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